Wie füge ich mit bash nach jeder Zeile in einer Datei eine Zeichenfolge hinzu? Kann man das mit dem Befehl sed machen, wenn ja wie?
Wie füge ich mit bash nach jeder Zeile in einer Datei eine Zeichenfolge hinzu? Kann man das mit dem Befehl sed machen, wenn ja wie?
Antworten:
Wenn Sie sed
die Bearbeitung über den -i
Parameter zulassen:
sed -e 's/$/string after each line/' -i filename
Wenn nicht, müssen Sie eine temporäre Datei erstellen:
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
$ bedeutet Zeilenende. ^ bedeutet Zeilenanfang.
sed 's/^/string after each line/'
pfeife , mache ich das , was ich erwarten würde (vor jeder Zeile), sed 's/^/string after each line/'
aber nicht (es ersetzt die gesamte Zeile durch meine Anhängezeichenfolge). Was gibt? Irgendwelche Ideen @TomDeGisi?
Ich benutze lieber awk
. Wenn es nur eine Spalte gibt, verwenden Sie $0
, andernfalls ersetzen Sie sie durch die letzte Spalte.
Einweg,
awk '{print $0, "string to append after each line"}' file > new_file
oder dieses,
awk '$0=$0"string to append after each line"' file > new_file
NR
Variable verwenden:awk '{print $0, NR}'
sed 's/ //g'
das hat für meine Anforderung funktioniert, aber es wird Platz in jeder Zeile entfernen, das ist die Option g
für und überall in einer Zeile.
,
wie {print $0"string to append after each line"}
.
Wenn Sie es haben, kann das Dienstprogramm lam (Laminat) dies tun, zum Beispiel:
$ lam filename -s "string after each line"
Reine POSIX-Shell und sponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
und printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
Verwenden von join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
Shell - Tools paste
, yes
, head
& wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Beachten Sie, dass zuvor paste
ein Tabulatorzeichen eingefügt wird $suffix
.
Natürlich sponge
kann durch eine temporäre Datei ersetzt werden, danach mv
über den ursprünglichen Dateinamen, wie bei einigen anderen Antworten ...
sed
, es sei denn, die Ressourcen sind sehr begrenzt.
sed
wird für einen so einfachen Job nicht benötigt.
Ich bevorzuge echo
. mit reinem Bash:
cat file | while read line; do echo ${line}$string; done
Sed ist ein bisschen hässlich, man könnte es elegant so machen:
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; getan foobar barbar bazbar, aber nach einigen Tests könnte ich mich in meiner Argumentation irren, aber Dennis hat recht
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
wenn 2 Zeilen gedruckt werden, obwohl die Eingabe 1 Zeile ist foo bar
(und das cat
Lesen von stdin anstelle einer Datei macht hierfür keinen Unterschied).
touch
die temporäre Datei? Und ich würde densed
Befehl davon abhängig machen, dass der Erfolg descp
oder des Originals verloren gehen könnte.