schlag Expansion in Sed regexp:: einen Fall Klausel X = Entfernung 'a \ .B'; Y = ';;' SED -n '/ $ {X} /, / $ {Y} / d'

StackOverflow https://stackoverflow.com/questions/3009202

Frage

Ich versuche, einen Fall Klausel aus einem Bash-Skript zu entfernen. Die Klausel wird variieren, aber wird immer Schrägstriche als Teil des Fall-Match-String hat.

Ich habe versucht, sed, kann aber awk oder einen Perl-Einzeiler in dem Bash-Skript verwenden.

Das Ziel der Bearbeitung ist einfach, ähnelt:

 $cat t.sh
 case N in 
 a\.b); 
   #[..etc., varies] 
 ;;
 esac

Ich bin mit afoul der variablen Expansion Schrägstriche, Semikolons oder beides zu entkommen. Wenn ich ‚eval‘ ich meine Backslash entkommt abzustreifen. Wenn ich es nicht tun, die Semikolons fangen mich auf. Also habe ich versucht Subshell Expansion innerhalb der sed. Diese Fouls der Dolmetscher, wie ich es geschrieben habe. Mehr, um die Semikolons zu entkommen scheint nicht zu helfen.

X='a\.b' ; Y=';;'   
sed -i '/$(echo ${X} | sed -n 's/\\/\\\\/g')/,/$(echo ${Y} | sed -n s/\;/\\;/g')/d t.sh

Und dies:

perl -i.bak -ne 'print unless /${X}/ .. /{$Y}/' t.sh  # which empties t.sh

und

eval perl -i.bak -ne \'print unless /${X}/ .. /{$Y}/' t.sh  # which does nothing
War es hilfreich?

Lösung

Bash printf hat ein Zitat Merkmal, dass wird helfen:

X='a\.b'; Y=';;'
sed "/$(printf "%q" "$X")/,/$(printf "%q" "$Y")/d" t.sh

oder Sie können zusätzlich die printf Variablenzuweisung Funktion verwenden:

printf -v X "%q" 'a\.b'
printf -v Y "%q" ';;'
sed "/$X/,/$Y/d" t.sh

Beachten Sie die Verwendung von doppelten Anführungszeichen um das sed Befehlsargument. Apostrophe wird die Expansion von Variablen und Kommandosubstitution verhindern. Wenn diese nicht verwendet werden, aber es ist in der Regel am besten einfache Anführungszeichen zu verwenden.

Andere Tipps

X='a\.b'
Y=';;'
perl -i.bak -ne 'print unless /\Q'$X'/ .. /\Q'$Y'/' t.sh

Dies ist für Spiele mit Shell zu zitieren, aber es funktioniert ziemlich gut. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top