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?
112
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
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.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,
oder dieses,
quelle
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 Optiong
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:
quelle
Reine POSIX-Shell und
sponge
:xargs
undprintf
:Verwenden von
join
:Shell - Tools
paste
,yes
,head
&wc
:Beachten Sie, dass zuvor
paste
ein Tabulatorzeichen eingefügt wird$suffix
.Natürlich
sponge
kann durch eine temporäre Datei ersetzt werden, danachmv
über den ursprünglichen Dateinamen, wie bei einigen anderen Antworten ...quelle
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:quelle
Sed ist ein bisschen hässlich, man könnte es elegant so machen:
quelle
cat foo
; echo $ {i} bar; getan foobar barbar bazbar, aber nach einigen Tests könnte ich mich in meiner Argumentation irren, aber Dennis hat rechtecho "foo bar" | (for i in `cat`; do echo ${i}bar; done)
wenn 2 Zeilen gedruckt werden, obwohl die Eingabe 1 Zeile istfoo bar
(und dascat
Lesen von stdin anstelle einer Datei macht hierfür keinen Unterschied).