Modifica um arquivo sem criar outro arquivo [duplicado]

10
    

Esta pergunta já tem uma resposta aqui:

    

Existe uma maneira de modificar um arquivo sem gravar o conteúdo em outro arquivo, sem sed e awk ?

Por exemplo:

$ cat test.txt
aaa
aaa
bbb
ccc
ddd

Substituindo a opção sed por -i , sed -i 's/aaa/NNN/g' test.txt produzirá o seguinte:

NNN
NNN
bbb
ccc
ddd

Como fazer isso sem awk e sed ?

    
por Prakki Rama 05.11.2014 / 10:15

6 respostas

17

Você pode usar um script vi :

$ vi test.txt -c '%s/aaa/NNN/ | wq'
$ cat test.txt
NNN
NNN
bbb
ccc
ddd

Você está simplesmente automatizando o que normalmente seria inserido ao usar vi no modo de comando (acessado usando Esc : normalmente):

% - execute o seguinte comando em todas as linhas:

s/aaa/NNN/ - subtítulo aaa com NNN

| - delimitador de comando

w - gravar alterações no arquivo

q - sair

    
por 05.11.2014 / 10:29
14

Usando esponja :

#!/bin/bash

pattern='aaa'
replacement='NNN'

while read -r line
do                                                                              
  printf '%s\n' "${line//$pattern/$replacement}"
done < "${1}"

Ligue para:

./script.sh test.txt | sponge test.txt
    
por 05.11.2014 / 10:29
13

Com ed , o editor de linhas:

ed -s test.txt <<< $',s/pattern/replace/g\nw\nq'

ou

ed -s test.txt <<IN
,s/pattern/replace/g
w
q
IN

ou

printf '%s\n' ,s/pattern/replace/g w q | ed -s test.txt
    
por 09.02.2015 / 13:01
5

Se você estiver usando bash ou ksh , poderá usar a substituição de padrões para variáveis de shell. Note, entretanto, que os shell globs básicos são menos poderosos e os shell globs estendidos têm alguns recursos que não sed e vice-versa. Para mais detalhes, consulte "Expansão de Parâmetros" em man 1 bash :

t=$(< test.txt); printf '%s\n' "${t//aaa/NNN}" >test.txt

Os shell globs estendidos são desativados por padrão, portanto, talvez seja necessário ativá-los explicitamente:

shopt -s extglob
    
por 05.11.2014 / 13:40
4

Você também pode usar perl

perl -pi -e 's/aaa/bbb/g' file.txt

Isso fornecerá a saída desejada.

Você também pode fazer backup do arquivo original automaticamente usando i.bak em vez de i . Isso criará um backup chamado file.txt.bak.

    
por 09.02.2015 / 15:15
2

Você pode usar o Vim no modo Ex:

ex -sc '%s/aaa/NNN/|x' test.txt
  1. % seleciona todas as linhas

  2. s substituto

  3. x salvar e fechar

por 11.04.2016 / 03:15