Para sua primeira pergunta
Para que esse comando funcione, um delimitador de alterações ajuda. Além disso, as aspas simples dentro do comando sed precisam ser escapadas adequadamente para protegê-las do shell:
sed 's|grep '\''search string'\''|sed '\''/search string/,/search string/{//!d}'\''|g' file
Por exemplo, usando este arquivo de teste:
$ cat file
grep 'search string'
O comando acima produz:
$ sed 's|grep '\''search string'\''|sed '\''/search string/,/search string/{//!d}'\''|g' file
sed '/search string/,/search string/{//!d}'
Para alterar o arquivo, adicione o sinalizador -i
:
sed -i 's|grep '\''search string'\''|sed '\''/search string/,/search string/{//!d}'\''|g' file
Para sua segunda pergunta
sed -r 's/(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/| /' filename
Por exemplo, considere este arquivo de teste:
$ cat filename
succ_1st='grep 'resulted in successful answer' $path_tmp/named.stats.tmp | sed '/localhost.localdomain/,/testdns.net/{//!d}' | awk '{ print $1 }' | grep -m1 '''
Este comando produz:
$ sed -r 's/(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/| /' filename
succ_1st='sed '/localhost.localdomain/,/testdns.net/{//!d}' $path_tmp/named.stats.tmp | grep 'resulted in successful answer' | awk '{ print $1 }' | grep -m1 '''
Para alterar o arquivo no local, adicione o sinalizador -i
:
sed -ir 's/(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/| /' filename
Comandos do Vi
O primeiro comando acima pode ser realizado no vim com:
%s/grep 'search string'/sed '\/search string\/,\/search string\/{\/\/!d}'/g
O comando de troca pode ser executado dentro do vim com:
%s/\v(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/| /