Jsem relativní linuxový nováček. Předpokládejme, že mám textový soubor a.txt
který obsahuje následující text:
A
B
C
Nyní, pokud chci změnit text na řádku 2 (který obsahuje B
), mohu použít následující sed
příkaz:
sed -i '2s/^.*$/X/' a.txt
pro změnu B
do X
, například.
Ale teď předpokládejme, že chci napsat sed
příkaz, který změní text na řádku 2 na něco, co obsahuje bash string proměnná. Chci změnit text na řádku 2 na fname="myaddress"
, kde jsou uvozovky uvedeny explicitně a kde myaddress
je proměnná řetězce bash (definováno někde jinde). Abych to zkusil, vytvořil jsem bash shell skript nazvaný mytest.sh
a obsahující následující:
#!/bin/bash
myaddress="/home/"
echo fname="$myaddress"
head a.txt
sed -i '2s/^.*$/fname="$myaddress"/' a.txt
head a.txt
Nyní echo fname="$myaddress"
vytiskne fname="/home/"
, což je text, který chci být na řádku 2 a.txt
. Nicméně sed
místo toho vypíše fname="$myaddress"
na řádek 2 souboru a.txt
, pravděpodobně proto, že je uvnitř okolních apostrofů. Jinými slovy, výstup výše uvedeného bash shell skriptu je:
fname="/home/"
A
B
C
A
fname="$myaddress"
C
Moje otázka zní, jak mohu získat sed
skutečně vytisknout hodnotu uloženy v myaddress
a odkazováno pomocí $myaddress
?
Přijatá odpověď:
Existují dva problémy:Za prvé, jak již poznamenal Kevin, proměnné shellu musí být uzavřeny do dvojitých uvozovek, pokud mají být shellem rozšířeny. Za druhé, váš náhradní řetězec obsahuje /
, takže nemůžete použít /
zároveň jako oddělovač pro sed
. Pokud víte, že nějaký znak, řekněte ,
, se rozhodně nevyskytuje v náhradním řetězci, můžete tento znak použít jako sed
oddělovač, takže získáte
sed -i '2s,^.*$,fname="'"$myaddress"'",' a.txt