Comment puis-je utiliser des outils de traitement de texte pour insérer une nouvelle ligne après toutes les N lignes?
Exemple pour N = 2:
CONTRIBUTION:
sadf
asdf
yxcv
cxv
eqrt
asdf
SORTIE:
sadf
asdf
yxcv
cxv
eqrt
asdf
Comment puis-je utiliser des outils de traitement de texte pour insérer une nouvelle ligne après toutes les N lignes?
Exemple pour N = 2:
CONTRIBUTION:
sadf
asdf
yxcv
cxv
eqrt
asdf
SORTIE:
sadf
asdf
yxcv
cxv
eqrt
asdf
Réponses:
Avec awk
:
awk ' {print;} NR % 2 == 0 { print ""; }' inputfile
Avec sed
( GNU
extension):
sed '0~2 a\\' inputfile
Avec bash
:
#!/bin/bash
lines=0
while IFS= read -r line
do
printf '%s\n' "${line}"
((lines++ % 2)) && echo
done < "$1"
sed '0~2 a\ '
ajoute un espace à chaque nouvelle ligne insérée. Si vous voulez ajouter une nouvelle ligne après chaque ligne, l' un de ces travaux de façon similaire: sed '0~1 a\ '
, sed 'a\ '
, ou tout simplement sed G
.
sed n\;G <infile
... est tout ce dont vous avez besoin ...
Par exemple:
seq 6 | sed n\;G
1
2
3
4
5
6
... (et un blanc suit également le 6) ... ou ...
seq 5 | sed n\;G
1
2
3
4
5
(et aucun blanc ne suit le 5)
Si un blanc doit toujours être omis dans un cas de dernière ligne:
sed 'n;$!G' <infile
Une autre saveur awk:
awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
Avec (GNU) sed
:
sed '0~2G'
Court (moche pour N = 100):
sed 'n;G'
man sed explique ~ comme:
first ~ step
Correspond à chaque étape de la ligne commençant par la ligne en premier. Par exemple, `` sed -n 1 ~ 2p '' imprimera toutes les lignes impaires dans le flux d'entrée, et l'adresse 2 ~ 5 correspondra à chaque cinquième ligne, en commençant par la seconde. le premier peut être zéro; dans ce cas, sed fonctionne comme s'il était égal à step. (Ceci est une extension.)
Avec d'autres sed (Count new lines):
sed -e 'p;s/.*//;H;x;/\n\{2\}/{g;p};x;d'
Ou, pour être plus portable, écrit comme (supprimer les commentaires pour certaines versions de sed):
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.
Avec awk
, probablement:
awk '1 ; NR%2==0 {printf"\n"} '
[[ ]]
tester:while read line; do echo "$line"; ((lines++ % 2)) && echo; done
.