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:
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
Puoi aggiungere il testo $0in awk se corrisponde alla condizione:
awk '/^all:/ {$0=$0" anotherthing"} 1' file
/patt/ {...}se la linea corrisponde al modello fornito da patt, allora esegui le azioni descritte all'interno {}./^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.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
awk: can't set $0
/usr/xpg4/bin/awkche è il "buon" awk.
In bash:
while read -r line ; do
[[ $line == all:* ]] && line+=" anotherthing"
echo "$line"
done < filename
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"
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.
awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
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.