La question dit plus ou moins tout. Je suis conscient que /^$/d
cela supprimera toutes les lignes vides, mais je ne vois pas comment dire «remplacer deux lignes vides ou plus par une seule ligne vierge»
Des idées?
La question dit plus ou moins tout. Je suis conscient que /^$/d
cela supprimera toutes les lignes vides, mais je ne vois pas comment dire «remplacer deux lignes vides ou plus par une seule ligne vierge»
Des idées?
Réponses:
Si vous ne tirez pas vim ou sed pour une autre utilisation, cat dispose en fait d'un moyen simple et pratique pour réduire plusieurs lignes vierges, utilisez-le cat -s
.
Si vous étiez déjà dans vim et je voulais rester là - bas, vous pouvez le faire avec la recherche interne et de le remplacer par l' émission: :%s!\n\n\n\+!^M^M!g
(Le ^ M est la représentation visuelle d'une nouvelle ligne, vous pouvez le saisir en appuyant sur Ctrl+ vEnter), ou vous sauver la tapant simplement en les bombardements au chat: :%!cat -s
.
:%!cat -s
. Apprendre quelque chose GNnew tous les jours!
%s!\n\n\n\+!\r\r!g
Utilisez \n
pour indiquer une nouvelle ligne dans le modèle de recherche. Utilisez Ctrl+ Mdans le texte de remplacement ou une référence arrière. Voir :help pattern
et :help sub-replace-special
(lié depuis :help :s
).
%s/\(\n\n\)\n\+/\1/
\n
cela ne fonctionne pas dans le texte de remplacement.
Si vous êtes dans Vim, faites simplement ceci:
:%!cat -s
man
page.
Utiliser Perl:
perl -00 -pe ''
-00
L'option de ligne de commande active le mode slurp de paragraphe, ce qui signifie que Perl lit le texte paragraphe par paragraphe plutôt que ligne par ligne.
Avec sed (GNU sed) 4.2.2:
sed -r '
/^\s*$/ {
# blank line
:NEXT
N # append next line to pattern space - if none, autoprint PS and exit
s/^\s*$\n^\s*$//g;t NEXT # if 2 blank lines, clear PS and loop to NEXT
}
# else, autoprint PS and next/exit
' < $MYFILE
Je sais que c'est un code idiot, mais je voulais résoudre ce problème en moins de 10 minutes, et cela a fonctionné
for file in /directory/*
do
originalname=$file
us='_'
tempname=$file$us
echo $originalname
mv $originalname $tempname
uniq $tempname $originalname
rm $tempname
done
uniq
supprime les lignes égales adjacentes. Ce qui n'est pas ce que veut OP.
-s
option de chat - juste une note historique, ce n'est pas dans POSIX, mais semble être disponible dans BSD et GNU cat.