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
BSD sed GNU sed

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
GNU sed

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.


GNU sed

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 van sed implementaties. Voor GNU sed 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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow