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 seddie Bearbeitung über den -iParameter 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
NRVariable 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 gfü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 filexargsund printf:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge fileVerwenden von join:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge fileShell - Tools paste, yes, head
& wc:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Beachten Sie, dass zuvor pasteein Tabulatorzeichen eingefügt wird $suffix.
Natürlich spongekann 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.
sedwird 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 catLesen von stdin anstelle einer Datei macht hierfür keinen Unterschied).
touchdie temporäre Datei? Und ich würde densedBefehl davon abhängig machen, dass der Erfolg descpoder des Originals verloren gehen könnte.