Próbowałem poniższy kod, żeby wymienić QQ
z ZZ
, ale nie robi tego, co chcę:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Jednak ten kod robi to, co chcę:
sed -i 's/QQ/ZZ/g' $file
Jak używać zmiennych w sed
?
command-line
bash
sed
UAdapter
źródło
źródło
Odpowiedzi:
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
sed
teraz próbuje zastąpić każde wystąpienie literału$var1
przezZZ
.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:
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 me
zostanie zastąpiony przez"quote me"
(znak&
jest interpretowany przezsed
):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:
Zauważ, jak używam
s,pattern,replacement,
zamiasts/pattern/replacement/
, zrobiłem to, aby uniknąć zakłóceń/
w\0/
.Przykład
Powłoka następnie uruchamia powyższe polecenie
sed
z następnymi argumentami (przy założeniupattern=bert
ifile=text.txt
):Jeśli
file.txt
zawierabert
, wynik będzie:źródło
g
opcja, więcs,foo,bar,g
zamiast tego zdasz .\\0
zamiast tego\0
, nie należy tego robić, gdy\0
jest ujęty w pojedyncze cudzysłowy. W przeciwnym raziesed
wzór zastąpi literał\0
zamiast całego dopasowania.Możemy używać zmiennych przy
sed
użyciu podwójnych cudzysłowów:Jeśli masz
/
zmienną ukośną, użyj innego separatora, jak poniżej:źródło
/
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