sed
vervanging
Zoeken…
Vervanging met Shell-variabelen
Variabelen binnen enkele aanhalingstekens '
worden niet uitgebreid met POSIX-compatibele shells, dus het gebruik van een shell-variabele in een sed
substitutie vereist het gebruik van dubbele aanhalingstekens "
plaats van enkele aanhalingstekens '
:
$ var="he"
$ echo "hello" | sed "s/$var/XX/"
XXllo
$ var="he"
$ echo "hello" | sed 's/$var/XX/'
hello
Wees voorzichtig met opdrachtinjectie bij het evalueren van variabelen:
$ var='./&/;x;w/etc/passwd
> x;s/he'
$ echo "hello" | sed "s/$var/XX/"
sed: /etc/passwd: Permission denied
Als het bovenstaande als root werd uitgevoerd, was de uitvoer niet te onderscheiden van het eerste voorbeeld en zou de inhoud van /etc/passwd
worden vernietigd.
terugverwijzing
Met behulp van ontsnapte haakjes kunt u een vastleggroep definiëren in een patroon waarnaar kan worden terugverwezen in de vervangingsreeks met \1
:
$ echo Hello world! | sed 's/\(Hello\) world!/\1 sed/'
Hello sed
Met meerdere groepen:
$ echo one two three | sed 's/\(one\) \(two\) \(three\)/\3 \2 \1/'
three two one
Wanneer u uitgebreide reguliere expressies gebruikt (zie Extra opties ), voert u haakjes standaard uit en hoeft u niet te ontsnappen:
$ echo one two three | sed -E 's/(one) (two) (three)/\3 \2 \1/'
three two one
Woorden bestaande uit letters, cijfers en onderstrepingstekens kunnen worden vergeleken met behulp van de uitdrukking [[:alnum:]_]\{1,\}
:
$ echo Hello 123 reg_exp | sed 's/\([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\)/\3 \2 \1/'
reg_exp 123 Hello
De reeks \w
is gelijk aan [[:alnum:]_]
$ echo Hello 123 reg_exp | sed 's/\(\w\w*\) \(\w\w*\) \(\w\w*\)/\3 \2 \1/'
reg_exp 123 Hello
Verschillende scheidingstekens gebruiken
Specificatie POSIX / IEEE Open Group Base zegt :
[2addr] s / BRE / vervanging / vlaggen
Vervang de vervangende string door instanties van de BRE in de patroonruimte. Elk ander teken dan backslash of newline kan in plaats van een schuine streep worden gebruikt om de BRE en de vervanging af te bakenen. Binnen de BRE en de vervanging kan het BRE-scheidingsteken zelf worden gebruikt als een letterlijk karakter als het wordt voorafgegaan door een backslash.
Er zijn gevallen waarin het scheidingsteken /
voor sed
vervanging zich in de BRE of vervanging bevindt, waardoor fouten optreden, zoals:
$ echo "2/3/4" | sed "s/2/3/X/"
sed: -e expression #1, char 7: unknown option to `s'
Hiervoor kunnen we verschillende scheidingstekens gebruiken, zoals #
of _
of zelfs een spatie:
$ echo "2/3/4" | sed "s#2/3#X#"
X/4
$ echo "2/3/4" | sed "s_2/3_X_"
X/4
$ echo "2/3/4" | sed "s 2/3 X "
X/4
Patroonvlaggen - vervanging van gebeurtenissen
Als we alleen het eerste exemplaar in een regel willen vervangen, gebruiken we sed
zoals gewoonlijk:
$ cat example
aaaaabbbbb
aaaaaccccc
aaaaaddddd
$ sed 's/a/x/' example
xaaaabbbbb
xaaaaccccc
xaaaaddddd
Maar wat als we alle gebeurtenissen willen vervangen?
We voegen gewoon de g
patroonvlag toe aan het einde:
$ sed 's/a/x/g' example
xxxxxbbbbb
xxxxxccccc
xxxxxddddd
En als we één specifiek exemplaar willen vervangen, kunnen we eigenlijk specificeren welk exemplaar:
$ sed 's/a/x/3' example
aaxaabbbbb
aaxaaccccc
aaxaaddddd
/3
is het derde optreden.
Van info sed
, zie GNU sed handleiding voor online versie
de POSIX-standaard geeft niet aan wat er moet gebeuren als u de modificaties
g
en NUMBER combineert, en er is momenteel geen brede overeenstemming over de betekenis vansed
implementaties. Voor GNUsed
is de interactie gedefinieerd als: negeer overeenkomsten vóór het NUMMER en vergelijk en vervang vervolgens alle overeenkomsten vanaf het NUMMER.
$ sed 's/b/y/2g' example
aaaaabyyyy
aaaaaccccc
aaaaaddddd
$ sed 's/c/z/g3' example
aaaaabbbbb
aaaaacczzz
aaaaaddddd