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' -i
opzione
sed -i '/^all:/ s/$/ anotherthing/' file
Oppure puoi reindirizzarlo a un altro file
sed '/^all:/ s/$/ anotherthing/' file > output
Puoi aggiungere il testo $0
in 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 anotherthing
alla riga.1
come 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/awk
che è 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 all
print the row plus "anotherthing", altrimenti stampa solo la riga.
awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
condition {actions}
coppie. Se condition
viene 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.