Você conhece o sinal i
/ I
no comando s
(extensão GNU, no entanto)?
Estou tentando usar o sed para substituir todas as ocorrências de antigo no arquivo por novo . Agora funciona com strings minúsculas, mas eu preciso substituir algumas strings que estão em maiúsculas. Por exemplo, substitua OLD por NOVO . Eu sei que o sed pode fazer isso, mas não consigo entender direito?
for file in .; do
cat $file
sed 's/old/new/g' $file | tee $file
done
Você pode usar o perl:
$ cat file
old news
OLD news
old Old oLD news
older news
$ perl -pe 's{(old)}{ ($tmp = $1) =~ tr/OLDold/NEWnew/; $tmp }ieg' file
new news
NEW news
new New nEW news
newer news
Que usa o operador s///
para pesquisar e substituir, e na substituição, translitera os caracteres de "antigo" para "novo", preservando o caso dos caracteres individuais. Isso só funciona porque "old" e "new" são do mesmo comprimento de string.
Eu preciso usar uma variável temporária porque $1
é um valor somente leitura.
Para substituir "old" por "new" e "OLD" por "NEW", diga ao sed para fazer as duas coisas:
for file in ./*; do
cat "$file"
sed -i -e 's/old/new/g; s/OLD/NEW/g' "$file"
done
Não se esqueça de citar as variáveis, caso você tenha um arquivo chamado some filename
(com espaços, novas linhas ou tabulações). Eu também adicionei -i
, uma extensão de extensão GNU, dado que você indicou que poderia usar a extensão de sinalização GNU / i , para informar ao sed para editar o arquivo no local em vez de confiar em tee
e em buffers para fazê-lo.
Dado que as strings são do mesmo tamanho, todos esses comandos funcionarão:
<infile sed 'y/OLDold/NEWnew/' >outfile
<infile tr 'OLDold' 'NEWnew' >outfile
sed -i 'y/OLDold/NEWnew/' infile