Ich verwende sed, um Muster in SAS-Dateien zu suchen und zu ersetzen, anstatt sie einzeln zu ändern. Das Problem ist, dass ich versuche, Makrovariablen zu ersetzen, und wenn ich das kaufmännische Und verwende, wird es nicht richtig verarbeitet.
Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas
Wenn ich diesen Befehl ausführe, scheint er alle Arten von Funky Stuff mit dem Originaltext anzufügen und auszuführen.
Frage: Wie ersetze ich Text, der kaufmännisches Und enthält, durch den Befehl sed?
&
ist ein Sonderzeichen , so dass es entgangen , wenn sie in der RHS verwendet werden muss - in Ihrem Fall müssen Sie laufen ,'s/user=&uid./user=\&sysuserid./g'
obwohl ich Sie auch brauchen , um die Flucht der Punkt in der LHS vermuten eine wörtliche Punkt zu entsprechen , so dass Sie wirklich brauchen's/user=&uid\./user=\&sysuserid./g'
Antworten:
&
im Ersetzungstext ist das Besondere: es bedeutet , „den ganzen Teil der Eingabe , die durch das Muster abgestimmt wurde“, so , was Sie hier tun , ersetztuser=&uidX
mituser=user=&uidXsysuserid.
. Verwenden Sie, um ein kaufmännisches Und in den Ersetzungstext einzufügen\&
.Eine andere Sache, die falsch aussieht, ist, dass
.
das Suchmuster für ein beliebiges Zeichen steht (außer für eine neue Zeile), aber das.
am Ende des Ersetzungstextes ist ein wörtlicher Punkt. Wenn Sie nur die Literalzeichenfolge ersetzen möchtenuser=&uid.
, schützen Sie die.
mit einem Backslash.Wenn Sie ein beliebiges Zeichen ersetzen und es im Ergebnis beibehalten möchten, fügen Sie das Zeichen in eine Gruppe ein und verwenden Sie
\1
in der Ersetzung, um auf diese Gruppe zu verweisen.In Anbetracht der Wiederholung zwischen dem Originaltext und der Ersetzung sollten Sie trotzdem Gruppen verwenden:
dh "ersetzen
u
durchsysuser
zwischenuser=&
undid.
".quelle
\(user=&\)
ist ein Muster,user&
das mit der Übereinstimmungszeichenfolge übereinstimmt und diese als Gruppe speichert (Gruppennummer 1, da dies die erste Gruppe im Muster ist). Dann wird in der Ersetzung\1
durch die für Gruppe 1 gespeicherte Zeichenfolge ersetzt.=
in regulären Ausdrücken und im Ersetzungstext steht für sich selbst,user=&
stimmt also nur übereinuser=&
, unduser=&
im Ersetzungstext ergibt sich,user=
gefolgt von dem Teil der Zeile, auf den der reguläre Ausdruck zutrifft.=
Zeichen hat keine besondere Bedeutung.user=&
Im Ersetzungstext wirduser=
gefolgt vom originalen übereinstimmenden Text erzeugt.user=\&
im ersatztext ergibt sichuser=&