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 sed
consente la modifica sul posto tramite il -i
parametro:
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
NR
variabile:awk '{print $0, NR}'
sed 's/ //g'
funzionato per le mie esigenze, ma rimuoverà lo spazio in ogni riga, questa è l'opzione g
per 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 file
xargs
e printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
Utilizzando join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
Strumenti Shell utilizzando paste
, yes
, head
e wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Nota che paste
inserisce un carattere di tabulazione prima $suffix
.
Ovviamente sponge
può essere sostituito con un file temporaneo, in seguito mv
sul nome del file originale, come con altre risposte ...
sed
, a meno che le risorse non siano molto limitate.
sed
non è 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 cat
leggere dallo stdin invece che da un file non fa differenza per questo).
touch
il file temporaneo? E renderei ilsed
comando condizionato al successocp
dell'originale o potrebbe essere perso.