Sed para substituir cadeias de caracteres minúsculas e maiúsculas

0

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
    
por Josh Adams 22.10.2018 / 15:40

4 respostas

2

Você conhece o sinal i / I no comando s (extensão GNU, no entanto)?

    
por 22.10.2018 / 15:49
2

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.

    
por 22.10.2018 / 18:34
1

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.

    
por 22.10.2018 / 17:17
0

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
    
por 22.10.2018 / 23:25

Tags