como trocar texto dentro de arquivos [duplicado]

1

Dentro do meu arquivo eu preciso trocar lugares de todas as instâncias de:

grep 'search string'

e

sed '/string of text/,/string of text/{//!d}'

No VI eu tentei um regex sem sorte - ele diz algo sobre caracteres finais.

:%s/grep 'search string'/sed '/string of text/,/string of text/{//!d}'/g

Eu também tentei com sed fora do arquivo: que diz evento não encontrado

sed -i 's/grep 'search string'/sed '/search string/,/search string/{//!d}'/g' filename. 

O que estou fazendo de errado e como posso fazer isso funcionar? Eu tenho muitos casos que preciso alterar e fazer isso manualmente não é uma opção.

Eu quero mudar esta linha de código:

succ_1st='grep 'resulted in successful answer' $path_tmp/named.stats.tmp | sed '/localhost.localdomain/,/testdns.net/{//!d}' | awk '{ print $1 }' | grep -m1 '''

para isso:

succ_1st='sed '/localhost.localdomain/,/testdns.net/{//!d}' $path_tmp/named.stats.tmp | grep 'resulted in successful answer' | awk '{ print $1 }' | grep -m1 '''

Estas são linhas de código de um script BTW

    
por user53029 25.09.2015 / 23:19

2 respostas

1

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[^|]*)/| /
    
por 26.09.2015 / 00:01
1

Não sed, principalmente bash:

string=$(cat <<'END'
succ_1st='grep 'resulted in successful answer' $path_tmp/named.stats.tmp | sed '/localhost.localdomain/,/testdns.net/{//!d}' | awk '{ print $1 }' | grep -m1 '''
END
)

var=$(cut -d''' -f1 <<<"$string")
code=$(cut -d''' -f2 <<<"$string")
IFS='|' read -ra commands <<<"$code"
filename=$( set -f; eval set -- "${commands[0]}"; echo ${!#} )  # danger
tmp=${commands[0]//${filename//\//\\/}/}
commands[0]="${commands[1]} $filename"
commands[1]=$tmp
printf -v new '%s'%s'' "$var" "$(IFS='|'; echo "${commands[*]}")"
echo "$new"
succ_1st=' sed '/localhost.localdomain/,/testdns.net/{//!d}'  $path_tmp/named.stats.tmp|grep 'resulted in successful answer'  | awk '{ print $1 }' | grep -m1 '''
    
por 25.09.2015 / 23:58