Come aggiungo una stringa dopo ogni riga in un file usando bash? Può essere fatto usando il comando sed, se sì come?
Come aggiungo una stringa dopo ogni riga in un file usando bash? Può essere fatto usando il comando sed, se sì come?
Risposte:
Se si sedconsente la modifica sul posto tramite il -iparametro:
sed -e 's/$/string after each line/' -i filename
In caso contrario, devi creare un file temporaneo:
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename
sed -e 's/^/string after each line/' -i filename $ significa fine riga. ^ significa l'inizio della riga.
sed 's/^/string after each line/'fa quello che mi aspetterei (antepone a ogni riga) ma sed 's/^/string after each line/'non lo fa (sostituisce l'intera riga con la mia stringa di aggiunta). Cosa succede? Qualche idea @TomDeGisi?
Preferisco usare awk. Se c'è una sola colonna, usa $0, altrimenti sostituiscila con l'ultima colonna.
Senso unico,
awk '{print $0, "string to append after each line"}' file > new_file
o questo,
awk '$0=$0"string to append after each line"' file > new_file
NRvariabile:awk '{print $0, NR}'
sed 's/ //g'funzionato per le mie esigenze, ma rimuoverà lo spazio in ogni riga, questa è l'opzione gper e ovunque in una riga.
, piace {print $0"string to append after each line"}.
Se ce l'hai, l' utilità lam (laminato) può farlo, ad esempio:
$ lam filename -s "string after each line"
Shell POSIX puro e sponge:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge filexargse printf:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge fileUtilizzando join:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge fileStrumenti Shell utilizzando paste, yes, head
e wc:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Nota che pasteinserisce un carattere di tabulazione prima $suffix.
Ovviamente spongepuò essere sostituito con un file temporaneo, in seguito mvsul nome del file originale, come con altre risposte ...
sed, a meno che le risorse non siano molto limitate.
sednon è necessario per un lavoro così semplice.
Io preferisco echo. usando pure bash:
cat file | while read line; do echo ${line}$string; done
Sed è un po 'brutto, potresti farlo elegantemente così:
hendry@i7 tmp$ cat foo
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar
cat foo; echo $ {i} bar; fatto foobar barbar bazbar ma dopo alcuni test, potrei sbagliarmi sul mio ragionamento, ma Dennis ha ragione
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)che stampa 2 righe anche se l'input è 1 riga foo bar(e catleggere dallo stdin invece che da un file non fa differenza per questo).
touchil file temporaneo? E renderei ilsedcomando condizionato al successocpdell'originale o potrebbe essere perso.