Come aggiungere alla fine delle righe contenenti un pattern con sed o awk?


89

Ecco un file di esempio:

somestuff...
all: thing otherthing
some other stuff

Quello che voglio fare è aggiungere alla riga che inizia con all:questo:

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

Risposte:


166

Questo funziona per me

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

La prima parte è un modello da trovare e la seconda parte è una normale sostituzione di sed usata $per la fine di una riga.

Se desideri modificare il file durante il processo, utilizza l' -iopzione

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

Oppure puoi reindirizzarlo a un altro file

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

Basta aggiungere qualcosa porta a una nuova riga, sostituire è il modo giusto.
zhy

10

Questo dovrebbe funzionare per te

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

Usando il comando s (sostituto) puoi cercare una riga che soddisfi un'espressione regolare. Nel comando sopra, &sta per la stringa corrispondente.


9

Puoi aggiungere il testo $0in awk se corrisponde alla condizione:

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

Spiegazione

  • /patt/ {...}se la linea corrisponde al modello fornito da patt, allora esegui le azioni descritte all'interno {}.
  • In questo caso: /^all:/ {$0=$0" anotherthing"}se la riga inizia (rappresentata da ^) con all:, aggiungere anotherthingalla riga.
  • 1come condizione vera, attiva l'azione predefinita di awk: stampa la riga corrente ( print $0). Questo accadrà sempre, quindi stamperà la riga originale o quella modificata.

Test

Per il tuo dato input restituisce:

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

Nota che potresti anche fornire il testo da aggiungere in una variabile:

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

Su Solaris riceverai l'errore:awk: can't set $0
dal

@ceving quindi puoi usare /usr/xpg4/bin/awkche è il "buon" awk.
fedorqui 'SO smettila di nuocere'

6

In bash:

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

6

Ecco un'altra semplice soluzione che utilizza sed.

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

Spiegazione:

all. * significa che tutte le righe iniziano con "all".

e rappresentano la corrispondenza (ovvero la riga completa che inizia con "all")

quindi sed sostituisce il primo con il successivo e aggiunge la parola "altro"


3

Soluzione con awk:

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

Semplicemente: se la riga inizia con allprint the row plus "anotherthing", altrimenti stampa solo la riga.


4
Puoi abbreviarlo in:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman

2
@ Prometeo, uno script awk è composto da condition {actions}coppie. Se conditionviene omesso, le azioni vengono eseguite per ogni record. Se {actions}vengono omessi e la condizione restituisce true (come nel caso del numero 1), l'azione predefinita è stampare il record corrente.
glenn jackman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.