Wie kann ich mit Textverarbeitungswerkzeugen nach jeweils N Zeilen eine neue Zeile einfügen?
Beispiel für N = 2:
EINGANG:
sadf
asdf
yxcv
cxv
eqrt
asdf
AUSGABE:
sadf
asdf
yxcv
cxv
eqrt
asdf
Wie kann ich mit Textverarbeitungswerkzeugen nach jeweils N Zeilen eine neue Zeile einfügen?
Beispiel für N = 2:
EINGANG:
sadf
asdf
yxcv
cxv
eqrt
asdf
AUSGABE:
sadf
asdf
yxcv
cxv
eqrt
asdf
Antworten:
Mit awk
:
awk ' {print;} NR % 2 == 0 { print ""; }' inputfile
Mit sed
( GNU
Erweiterung):
sed '0~2 a\\' inputfile
Mit bash
:
#!/bin/bash
lines=0
while IFS= read -r line
do
printf '%s\n' "${line}"
((lines++ % 2)) && echo
done < "$1"
sed '0~2 a\ '
Beachten Sie, dass der oben dokumentierte Befehl jeder eingefügten Zeile ein Leerzeichen hinzufügt. Wenn Sie wollten eine neue Zeile nach jeder Zeile hinzufügen, jede dieser ähnlich Arbeit: sed '0~1 a\ '
, sed 'a\ '
, oder einfach nur sed G
.
sed n\;G <infile
... ist alles, was du brauchst ...
Beispielsweise:
seq 6 | sed n\;G
1
2
3
4
5
6
... (und auf die 6 folgt auch ein Leerzeichen) ... oder ...
seq 5 | sed n\;G
1
2
3
4
5
(und nach der 5 folgt kein Leerzeichen)
Wenn in der letzten Zeile immer ein Leerzeichen weggelassen werden soll:
sed 'n;$!G' <infile
Ein weiterer Geschmack von awk:
awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
Mit (GNU) sed
:
sed '0~2G'
Kurz (hässlich für N = 100):
sed 'n;G'
man sed erklärt ~ als:
first ~ step
Stimmt mit jeder Zeile überein, die mit der ersten Zeile beginnt. Beispiel: "sed -n 1 ~ 2p" gibt alle ungeraden Zeilen im Eingabestream aus, und die Adresse 2 ~ 5 stimmt mit jeder fünften Zeile überein, beginnend mit der zweiten. Erstens kann Null sein. sed verhält sich in diesem Fall so, als wäre es gleich step. (Dies ist eine Erweiterung.)
Mit anderen sed (Neue Zeilen zählen):
sed -e 'p;s/.*//;H;x;/\n\{2\}/{g;p};x;d'
Oder, um portabler zu sein, geschrieben als (Kommentare für einige Versionen von sed entfernen):
sed -e ' # Start a sed script.
p # Whatever happens later, print the line.
s/.*// # Clean the pattern space.
H # Add **one** newline to hold space.
x # Get the hold space to examine it, now is empty.
/\n\{2\}/{ # Test if there are 2 new lines counted.
g # Erase the newline count.
p # Print an additional new line.
} # End the test.
x # match the `x` done above.
d # don't print anything else. Re-start.
' # End sed script.
Mit awk
wahrscheinlich:
awk '1 ; NR%2==0 {printf"\n"} '
[[ ]]
zu Test:while read line; do echo "$line"; ((lines++ % 2)) && echo; done
.