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