Pytanie mniej więcej mówi wszystko. Wiem, że /^$/d
usunie wszystkie puste linie, ale nie widzę, jak powiedzieć „zamień dwie lub więcej pustych linii na jedną pustą linię”
Jakieś pomysły?
Pytanie mniej więcej mówi wszystko. Wiem, że /^$/d
usunie wszystkie puste linie, ale nie widzę, jak powiedzieć „zamień dwie lub więcej pustych linii na jedną pustą linię”
Jakieś pomysły?
Odpowiedzi:
Jeśli nie używasz vima ani seda do innych celów, cat faktycznie ma łatwy wbudowany sposób na zwijanie wielu pustych linii, po prostu użyj cat -s
.
Jeśli byłeś już w vimie i chciałeś tam pozostać, możesz to zrobić za pomocą wewnętrznego wyszukiwania i zastąpić go, wydając: :%s!\n\n\n\+!^M^M!g
(^ M to wizualna reprezentacja nowego wiersza, możesz wprowadzić go, naciskając Ctrl+ vEnter), lub ocalić siebie wpisując po prostu łuskanie obecnie do kota: :%!cat -s
.
:%!cat -s
. Naucz się czegoś GNnew każdego dnia!
%s!\n\n\n\+!\r\r!g
Użyj, \n
aby wskazać nową linię we wzorcu wyszukiwania. Użyj Ctrl+ Mw tekście zastępczym lub odnośniku wstecznym. Zobacz :help pattern
i :help sub-replace-special
(link z :help :s
).
%s/\(\n\n\)\n\+/\1/
\n
nie działa w tekście zastępczym.
Jeśli w Vimie, po prostu zrób to:
:%!cat -s
man
strony.
Za pomocą Perla:
perl -00 -pe ''
-00
opcja wiersza poleceń włącza tryb slurp akapitowy, co oznacza, że Perl czyta tekst akapit po akapicie, a nie linia po linii.
Z 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
Wiem, że to głupi kod, ale chciałem rozwiązać ten problem w niecałe 10 minut i zadziałało
for file in /directory/*
do
originalname=$file
us='_'
tempname=$file$us
echo $originalname
mv $originalname $tempname
uniq $tempname $originalname
rm $tempname
done
uniq
usuwa sąsiednie równe linie. Nie tego chce OP.
-s
opcji cat - tylko historyczna notatka, nie ma jej w POSIX, ale wydaje się być dostępna w BSD i GNU cat.