Frage sagt mehr oder weniger alles. Mir ist bekannt, dass /^$/d
alle Leerzeilen entfernt werden, aber ich kann nicht sagen, wie zwei oder mehr Leerzeilen durch eine einzelne Leerzeile ersetzt werden sollen.
Irgendwelche Ideen?
Frage sagt mehr oder weniger alles. Mir ist bekannt, dass /^$/d
alle Leerzeilen entfernt werden, aber ich kann nicht sagen, wie zwei oder mehr Leerzeilen durch eine einzelne Leerzeile ersetzt werden sollen.
Irgendwelche Ideen?
Antworten:
Wenn Sie nicht für eine andere Verwendung vim oder sed feuern, hat cat tatsächlich eine einfache Möglichkeit, mehrere Leerzeilen zu kollabieren cat -s
. Verwenden Sie einfach .
Wenn Sie bereits in vim waren und dort bleiben :%s!\n\n\n\+!^M^M!g
möchten, können Sie dies mit dem internen Suchen und Ersetzen tun, indem Sie Folgendes eingeben : (Das ^ M ist die visuelle Darstellung einer neuen Zeile. Sie können es eingeben, indem Sie Ctrl+ drücken. vEnter) Oder speichern Sie sich das Eingabe von nur Katze Beschuss aus: :%!cat -s
.
:%!cat -s
. Lerne jeden Tag etwas Neues!
%s!\n\n\n\+!\r\r!g
Verwenden Sie \n
diese Option, um eine neue Zeile im Suchmuster anzugeben. Verwenden Sie Ctrl+ Mim Ersetzungstext oder einen Rückverweis. Siehe :help pattern
und :help sub-replace-special
(verlinkt von :help :s
).
%s/\(\n\n\)\n\+/\1/
\n
das im Ersetzungstext nicht funktioniert.
Wenn Sie in Vim sind, machen Sie einfach Folgendes:
:%!cat -s
man
Seite handelt.
Perl benutzen:
perl -00 -pe ''
-00
Die Befehlszeilenoption aktiviert den Slurp-Modus für Absätze, was bedeutet, dass Perl Text Absatz für Absatz und nicht Zeile für Zeile liest.
Mit 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
Ich weiß, dass dies alberner Code ist, aber ich wollte dieses Problem in weniger als 10 Minuten lösen, und es hat funktioniert
for file in /directory/*
do
originalname=$file
us='_'
tempname=$file$us
echo $originalname
mv $originalname $tempname
uniq $tempname $originalname
rm $tempname
done
uniq
Entfernt benachbarte gleiche Linien. Welches ist nicht das, was OP will.
-s
Option cat nicht - nur eine historische Anmerkung, sie ist nicht in POSIX enthalten, scheint aber in BSD und GNU cat verfügbar zu sein.