Jak używać zmiennych w poleceniu sed?

Odpowiedzi:

358

Powłoka odpowiada za rozwijanie zmiennych. Kiedy użyjesz pojedynczych cudzysłowów dla ciągów, jego zawartość będzie traktowana dosłownie, więc sedteraz próbuje zastąpić każde wystąpienie literału $var1przez ZZ.

Używanie podwójnych cudzysłowów

Użyj podwójnych cudzysłowów, aby powłoka rozwijała zmienne przy jednoczesnym zachowaniu białych znaków:

sed -i "s/$var1/ZZ/g" "$file"

Kiedy potrzebujesz znaku cudzysłowu w ciągu zastępującym, musisz poprzedzić go odwrotnym ukośnikiem, który zostanie zinterpretowany przez powłokę. W poniższym przykładzie ciąg quote mezostanie zastąpiony przez "quote me"(znak &jest interpretowany przez sed):

sed -i "s/quote me/\"&\"/" "$file"

Korzystanie z pojedynczych cytatów

Jeśli masz dużo meta-znaków powłoki, rozważ użycie pojedynczych cudzysłowów dla wzorca i podwójnych cudzysłowów dla zmiennej:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

Zauważ, jak używam s,pattern,replacement,zamiast s/pattern/replacement/, zrobiłem to, aby uniknąć zakłóceń /w \0/.

Przykład

Powłoka następnie uruchamia powyższe polecenie sedz następnymi argumentami (przy założeniu pattern=berti file=text.txt):

-i
s,bert,Say hurrah to &: \0/,
text.txt

Jeśli file.txtzawiera bert, wynik będzie:

Say hurrah to bert: \0/
Lekensteyn
źródło
2
Jak przejść przez opcję „/ g” za pomocą tego formularza oddzielonego przecinkami?
blong
6
@ b.long Jest to gopcja, więc s,foo,bar,gzamiast tego zdasz .
Lekensteyn,
1
Twój przykład pojedynczego cytatu jest szczególnie użyteczny, całkiem ładnie obejmuje wzór regex!
Brian Thomas
Jeśli masz ochotę użyć \\0zamiast tego \0, nie należy tego robić, gdy \0jest ujęty w pojedyncze cudzysłowy. W przeciwnym razie sedwzór zastąpi literał \0zamiast całego dopasowania.
Lekensteyn,
Wykonał dla mnie lewę.
jimh 12.12.18
114

Możemy używać zmiennych przy sedużyciu podwójnych cudzysłowów:

sed -i "s/$var/r_str/g" file_name

Jeśli masz /zmienną ukośną, użyj innego separatora, jak poniżej:

sed -i "s|$var|r_str|g" file_name
mani
źródło
7
Jeśli masz ukośnik /w zmiennej => To mnie uratowało! Moja zmienna jest adresem URL i zawiera /. Przejście na używanie |jako separatora naprawiło mój problem
sonlexqt
Kciuk w górę dla „jeśli masz ukośnik w zmiennej”
Tiina,