Как заменить много промежуточных пустых строк только одной пустой строкой в ​​каждой - PullRequest
2 голосов
/ 17 июля 2010

Я учусь использовать sed и у меня есть гипотетическое требование:

bash$ cat states
California


Massachusetts


Arizona

Wisconsin

Я хотел бы вывод: (В основном я хочу только одну пустую строку между ними)

California

Massachusetts

Arizona

Wisconsin

Пожалуйста, предложите способы сделать это с помощью sed. Следует ли использовать концепцию многострочного шаблонного пространства и т. Д.

Спасибо

Jagrati


В ответ на одно из замечаний: «Хорошо, я запустил несколько тестовых сценариев, и я ошибся в гипотезе, согласно которой критерии выбора адресного пространства применяются только один раз. Кажется, активируется снова и снова.

bash$ cat file 
a 
b 
c 
a 
b 
c 

bash$ sed -e '/a/,/b/s/$/x/g' file 
ax 
bx 
c 
ax 
bx 
c 

У меня было впечатление, что это даст:

ax 
bx 
c 
a 
b 
c

Так может кто-нибудь объяснить, как происходит sed в случае разделенных запятыми адресных пространств.

Ответы [ 5 ]

6 голосов
/ 17 июля 2010

Попробуйте, это удалит все последовательные пустые строки

cat states | sed '/./,/^$/!d'

выходы:

California

Massachusetts

Arizona

Wisconsin
2 голосов
/ 17 июля 2010

Это может быть выполнено без sed, но также без удовлетворения ваших требований к обучению sed:

cat -s states

Интересно отметить, что три примера для выполнения, приведенные в info sed для GNU sed, намного сложнее, чем Дальтон и ответы Марко .

Вот эти версии, сжатые в одну строку:

sed ':x;/^\n*$/{N;bx};s/\n*/\n/' states

sed '1,/^./{/./!d};:x;/./!{N;s/^\n$//;tx}' states

sed -ne '/./!d;:x;p;n;/./bx;:z;n;/./!bz;i\ ' -e 'bx' states
2 голосов
/ 17 июля 2010

Я знаю, что OP явно попросил решение, используя sed и / или awk, но проблему также можно решить с помощью команды cat:

cat -s file

В противном случае, есть еще один способ решения проблемы.с помощью sed:

sed '/./!d; G' file

, который использует G для добавления пустой строки ко всем непустым строкам, найденным в файлах.

1 голос
/ 17 июля 2010

вы также можете использовать awk

$ cat file
California


Massachusetts


Arizona

Wisconsin

$ awk 'NF{print;print ""}'  file
California

Massachusetts

Arizona

Wisconsin
0 голосов
/ 26 июля 2010
grep . file > file_op
...