2017-12-10 6 views
0

Ich habe eine einfache (zumindest dachte ich es war) Zuweisung, wo ich sed verwenden muss, um eine Zeichenfolge durch meinen Benutzernamen in einer Datei zu ersetzen. Lassen Sie uns sagen, dass es Inhalt sieht wie folgt aus:UNIX Sed und inverse Zeichensuche

1) 
2) 
3) 
3) www 
www 3) 
3) 
7) 

Die Zuordnung besteht aus 3 Teilen:

-replace '3)' mit Ihrem Benutzernamen. Dieser Befehl funktioniert gut:

sed -e "s/3)/$USER/" file 

-replace '3)' mit Ihrer ID nur in Zeilen mit 'www' Zeichenfolge. Mit geringfügigen Verbesserungen erhält die Befehlsform des ersten Teils auch die Arbeit getan:

sed -e "/www/ s/3)/$USER/" file 

Im letzten Teil der Aufgabe muß ich 3 ersetzen) mit meiner ID nur in den Zeilen ohne ‚www‘. Gibt es eine einfache Möglichkeit, die Suche nach einer Zeichenfolge mithilfe von sed umzukehren? bis jetzt habe ich eine Idee, um eine Reihe von 3 Zeichen in "[]" zu negieren, aber leider funktioniert es nicht wirklich.

sed -e "/[^/(www/)]/ s/3)/$USER/" file 

Antwort

2

Verwenden Sie ! nach der Adresse. Beachten Sie, dass die meisten Shells verwenden! als ein history expansion Zeichen, so muss es richtig zitiert werden:

sed -e '/www/!s/3)/'"$USER/" file 
+0

Nachdem ich die Anführungszeichen behoben Ihre Lösungen funktioniert super Sed-e "/ www /! s/3)/$ USER /" Datei Danke! –

+0

Ich frage nur aus reiner Neugier: Gibt es eine Möglichkeit, Shell nur den $ USER-Teil als Variable interpretieren zu lassen, wenn der Rest in einfachen Anführungszeichen steht? Wenn ich versuche, '/ www /! S/3) zu verwenden/$ $ USER /' 'Shell interpretiert $ USER als eine normale Zeichenfolge –

+0

In der Befehlszeile! in Anführungszeichen ist immer noch etwas Besonderes. Zitate sind nicht in Bash verschachtelt, aber Sie müssen nur den) und den Benutzernamen angeben, also sollte '/ www /! S/3 ')' /" $ USER "/' funktionieren. – choroba