Eu quero alterar cada linha em um arquivo de texto usando sed ou solução alternativa

4

Eu quero alterar cada linha em um arquivo de texto usando sed ou solução alternativa

input.txt contendo

line 1
line 2 
line 3 
...

output.txt deve adicionar duas strings e

<before> line 1 and <after each line>
<before> line 2 and <after each line>
<before> line 3 and <after each line>
...

Posso usar sed ou outra coisa?

    
por Confluentes Info 09.09.2017 / 21:45

6 respostas

8

com o awk:

awk '{print before, $0, after}' before="<before>" after="and <after each line" input.txt > output.txt

Isto apenas imprime o conteúdo da variável before , $0 (a linha atual) e a variável after , separados por espaços. As variáveis são definidas após a expressão awk.

    
por muru 09.09.2017 / 22:11
8

com sed:

sed 's/.*/<before> & and <after each line>/' input.txt > output.txt

Explicações

  • s/x/y/ - substitua x por y
  • .* - pegue toda a linha
  • & - obter texto correspondente

O restante é apenas o texto que você deseja adicionar antes e depois de & .

    
por dessert 09.09.2017 / 21:53
5

Com perl :

perl -ne 'chomp; print "<before> $_ and <after each line>\n"' in.txt > out.txt

Estas alterações podem ser úteis:

  • Substitua <before> e and <after each line> pelo que você realmente deseja adicionar.
  • Remova > out.txt para enviar a saída para o seu terminal e não para um arquivo.
  • Você pode remover o nome do arquivo de entrada ( in.txt ) e inserir uma entrada interativamente para teste.

Como funciona:

  • -p faz o interlocutor Perl operar em cada linha (veja perldoc perlrun ou man perlrun ).
  • -e faz com que o próximo argumento seja um script perl. Então a parte em ' ' é o código Perl.
  • chomp remove o terminador de linha (nova linha) no final de cada linha perl recebe.
  • " " interpolação de suporte a strings. $_ é a linha lida. \n é um caractere nova linha .
  • perl usará in.txt como o arquivo de entrada. O > em > out.txt informa a sua shell para a saída redirect .

Este comando tem o mesmo efeito, pois -p (diferentemente de -n ) imprime automaticamente cada linha ( $_ ):

perl -pe 'chomp; $_ = "<before> $_ and <after each line>\n"' in.txt > out.txt

Existem mais maneiras de sed de usar perl . Uma vantagem das formas mostradas aqui é a legibilidade.

    
por Eliah Kagan 10.09.2017 / 02:47
4

Você também pode usar o coreutils:

n=$(wc -l < infile)
paste -d '' <(yes '<before>' | head -n $n) \
            infile                         \
            <(yes '</after>' | head -n $n)

Saída:

<before>line 1</after>
<before>line 2</after>
<before>line 3</after>
    
por Thor 10.09.2017 / 01:43
4

Com vi / vim / ex , você pode escrever um one-liner não interativo para isso, ou fazê-lo em um editor aberto.

Você pode usar qualquer um desses comandos do seu shell. Eles abrem o editor, adicionam texto ao início e ao final de cada linha, salvam o arquivo com um nome de arquivo diferente e encerram o editor:

ex in.txt '+%s/.*/<before> & and <after each line>/' '+wq out.txt'
vi in.txt '+%s/.*/<before> & and <after each line>/' '+wq! out.txt'

O primeiro comando usa ex mode e wq é suficiente para salvar o buffer como out.txt e sair. O segundo comando usa o modo vi e, como o buffer alterado ainda está aberto e não foi salvo no arquivo original , ele requer a versão ! do comando.

O segundo comando também funciona no modo ex (e com vim em vez de vi ), mas não há razão para evitar ex para one-liners. A verdadeira razão pela qual mostro a versão vi que você pode usar, com : em vez de + em cada comando, para executar a alteração interativamente durante a edição interativa em vi ou vim .

Com in.txt aberto no editor ( vim in.txt ) você pode executar:

:%s/.*/<before> & and <after each line>/
:wq! out.txt

Quer você use a versão não interativa ou interativa, eles funcionam da mesma maneira. vi e vim (e muitos outros editores de texto na " vi family") suportam pesquisa e substituição com uma sintaxe sed -like. Você notará a semelhança com o método sed na resposta da sobremesa :

  • .* é uma expressão regular que corresponde a qualquer caractere ( . ) zero ou mais vezes ( * ), correspondendo assim a uma linha inteira.
  • & significa todo o jogo.
  • s/pattern/replacement/ substitui a primeira ocorrência de pattern em uma linha com replacement .

sed aplica automaticamente seu script na linha cada . vi / vim / ex oferece um controle mais refinado. %s executa a ação de pesquisa e substituição ( s ) em todas as linhas ( % ) e também pode ter sido escrito 1,$s . Se você quisesse mudar apenas uma linha, poderia escrever algo como 3s (apenas a terceira linha). Da mesma forma, você pode alterar qualquer intervalo de linhas, por exemplo, 3,10s da terceira para a décima linhas ou 10,$s da décima e todas as linhas com números mais altos.

    
por Eliah Kagan 10.09.2017 / 17:25
2

Com awk e sed

awk 'NF' input.txt | sed -r 's/(.*)/<before>  and <after line>/' > out.txt

Explicação:

    O comando
  1. awk remove linhas em branco e canaliza a saída para sed

  2. sed captura cada linha e adiciona os textos necessários antes e depois do valor retornado e redireciona a saída para out.txt file

por George Udosen 09.09.2017 / 23:02