Wie kann man einen langen sed Ausdruck in mehrere Zeilen aufteilen?

14
sed 's/[long1][long2]/[long3][long4]/' file.txt

Ich möchte diesen Befehl auf mehrere Zeilen aufteilen - etwa so:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

Das Verwenden \oder Trennen von Zeichenfolgen hat nicht funktioniert.

Raffael
quelle
Deshalb hat Perl den /xModifikator für Substitution.
Choroba
1
@Networker: Ja, danke, ich habe meine Antwort auch dort hinzugefügt
Raffael

Antworten:

8

Sie können eine lange Zeichenfolge in Bash-Variablen speichern und dann den folgenden sedBefehl verwenden:

string=[long1][long2]
replace= [long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file

Wenn Sie verwenden können perl, können Sie mit dem xModifikator ein langes Muster unterbrechen:

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file
cuonglm
quelle
1
Warum verwenden Sie so viele Anführungszeichen? sed "s/$string/$replace/" file.txtist gut.
Scott
1
Natürlich müssen Sie auch das Leerzeichen danach löschen replace=.
Scott
8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

Das Aufteilen auf mehrere Zeilen mit Backslash funktioniert, wenn keine neuen Zeilen eingerückt sind.

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a

Getestet auf Cygwin mit GNU sed 4.2.2

Raffael
quelle
Was ist deine sed Version? Ich teste mit GNU sed version 4.2.1und es funktioniert nicht.
Dienstag,
2
Sieht so aus, als würde am Ende der ersten Zeile ein Backslash fehlen, nach dem Schrägstrich?
Volker Siegel
6

Ein anderer Aspekt:

Wie wartbar sind die [long]oben genannten Elemente?

Je kürzer und eindeutiger Sie die Klauseln aufbewahren können, desto leichter können sie im Laufe der Zeit geändert und erweitert werden, und (sed-external) Fakten ändern sich um die von ihnen bereitgestellte Funktion.

z.B

sed \
-es / [minimal-s1] / [minimal-r1] / '\
-es / [minimal-s2] / [minimal-r2] / '\
-es / [minimal-s3] / [minimal-r3] / '\
-e 's / [minimal-s4] / [minimal-r4] /' 

... könnte etwas sein, das man anstreben und bevorzugen sollte.

Hannu
quelle
4

Sie können dies auch folgendermaßen aufteilen:

sed '/[long1][long2]/
    s//[long3][long4]/'

Oder vielleicht wie:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

Oder mit einem Heredoc:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
mikeserv
quelle