Como adicionar no final de linhas contendo um padrão com sed ou awk?


89

Aqui está um arquivo de exemplo:

somestuff...
all: thing otherthing
some other stuff

O que eu quero fazer é adicionar à linha que começa all:assim:

somestuff...
all: thing otherthing anotherthing
some other stuff

Respostas:


168

Isso funciona para mim

sed '/^all:/ s/$/ anotherthing/' file

A primeira parte é um padrão a ser encontrado e a segunda parte é uma substituição do sed comum usando $para o final de uma linha.

Se você deseja alterar o arquivo durante o processo, use a -iopção

sed -i '/^all:/ s/$/ anotherthing/' file

Ou você pode redirecioná-lo para outro arquivo

sed '/^all:/ s/$/ anotherthing/' file > output

Apenas adicionar algo leva a uma nova linha, substituir é o caminho certo.
zhy

11

Isso deve funcionar para você

sed -e 's_^all: .*_& anotherthing_'

Usando o comando s (substituir), você pode pesquisar uma linha que satisfaça uma expressão regular. No comando acima, &representa a string combinada.


10

Você pode anexar o texto $0no awk se ele corresponder à condição:

awk '/^all:/ {$0=$0" anotherthing"} 1' file

Explicação

  • /patt/ {...}se a linha corresponder ao padrão fornecido por patt, execute as ações descritas em {}.
  • Neste caso: /^all:/ {$0=$0" anotherthing"}se a linha começar (representada por ^) com all:, acrescente anotherthingà linha.
  • 1como uma condição verdadeira, dispara a ação padrão de awk: imprimir a linha atual ( print $0). Isso acontecerá sempre, então imprimirá a linha original ou a modificada.

Teste

Para sua entrada fornecida, ele retorna:

somestuff...
all: thing otherthing anotherthing
some other stuff

Observe que você também pode fornecer o texto para anexar em uma variável:

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff

No Solaris, você obterá o erro:awk: can't set $0
ceving

@ceving então você pode usar /usr/xpg4/bin/awkqual é o awk "bom".
fedorqui 'SO pare de prejudicar'

6

Em bash:

while read -r line ; do
    [[ $line == all:* ]] && line+=" anotherthing"
    echo "$line"
done < filename

6

Aqui está outra solução simples usando sed.

$ sed -i 's/all.*/& anotherthing/g' filename.txt

Explicação:

all. * significa todas as linhas iniciadas com 'all'.

& representa a correspondência (ou seja, a linha completa que começa com 'todos')

em seguida, o sed substitui o anterior pelo posterior e adiciona a palavra "outra coisa"


4

Solução com awk:

awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file

Simplesmente: se a linha começar com allimprimir a linha mais "outra coisa", caso contrário, imprima apenas a linha.


4
Você pode encurtar para:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman

2
@Prometheus, um script awk é composto de condition {actions}pares. Se conditionfor omitido, as ações serão executadas para cada registro. Se {actions}forem omitidos e a condição for avaliada como verdadeira (que é o caso do número 1), a ação padrão é imprimir o registro atual.
glenn jackman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.