Заміна декількох порожніх рядків одним порожнім рядком у vim / sed


42

Питання більш-менш каже все це. Я знаю, що /^$/dбуде видалено всі порожні рядки, але я не можу зрозуміти, як сказати "замінити два чи більше порожніх рядків одним порожнім рядком"

Будь-які ідеї?

Відповіді:


48

Якщо ви не стріляєте з vim або sed для іншого використання, кішка насправді має простий спосіб згорнути кілька порожніх рядків, просто скористайтеся cat -s.

Якщо ви вже були в vim і хотіли залишитися там, ви можете зробити це за допомогою внутрішнього пошуку і замінити видачею: :%s!\n\n\n\+!^M^M!g(^ M - візуальне зображення нового рядка, ви можете ввести його, натиснувши Ctrl+ vEnter), або збережіть собі друкуючи, просто викладаючи кішку: :%!cat -s.


уау, не знав -sваріант кота - просто історична записка, його немає в POSIX, але, здається, він доступний у BSD та GNU cat.
maxschlepzig

2
Позначення як "виграш" для :%!cat -s. Навчіться що-небудь GNnew щодня!
Ендрю Болстер

3
Я думаю, ви також можете використовувати \ r замість ^ М так:%s!\n\n\n\+!\r\r!g
Ніко Белік,

Мені це було потрібно сьогодні. Дякую, Калеб! :)
Dɑvïd

19

Використовуйте \nдля позначення нового рядка в шаблоні пошуку. Використовуйте Ctrl+ Mу тексті заміни або зворотній зв'язок. Дивіться :help patternта :help sub-replace-special(пов’язані з :help :s).

%s/\(\n\n\)\n\+/\1/

Чи можете ви поясніть, як працює схема пошуку?
Сагар Джайн

@sjmp Вимога: замініть два чи більше порожніх рядків одним порожнім рядком. Реалізація: замініть три чи більше послідовних нових рядків лише двома новими рядками. Дивіться посібник для пояснення конструкцій, які використовуються в команді.
Жил "ТАК - перестань бути злим"

Але навіщо потрібно використовувати групу, коли її вміст виправлено?
Сабунку

@Sabuncu Не потрібно використовувати групу. Але чому б не використати групу? Тут я використав групу, оскільки ви не можете скопіювати і вставити команду з новим рядком у текст заміни: вам потрібно вставити буквальний символ Ctrl + M, \nне працює в тексті заміни.
Жил "ТАК - перестань бути злим"

Тепер я розумію, дякую, що знайшли час для відповіді.
Сабунку

6

Якщо у Vim, просто зробіть це:

:%!cat -s

2
Ви можете додати трохи деталей про те, як це працює, навіть якщо це лише цитата зі manсторінки.
Jasonwryan

Не працював у Windows 7
користувач674669

0

Використання Perl:

perl -00 -pe ''

-00 Опція командного рядка вмикає режим призупинення абзацу, тобто Perl читає текст абзац за абзацом, а не рядок за рядком.


0

З 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

-2

Я знаю, що це нерозумний код, але я хотів вирішити це питання менше ніж за 10 хв, і воно спрацювало

for file in /directory/*
do
  originalname=$file
  us='_'
  tempname=$file$us
  echo $originalname
  mv $originalname $tempname
  uniq $tempname $originalname
  rm $tempname
done

1
uniqвидаляє сусідні рівні лінії. Що не те, чого хоче ОП.
pacholik

@pacholik він чітко сказав "Заміна кількох порожніх рядків одним порожнім рядком" НЕ видаляйте сусідні рівні лінії !!!
Махмуд Зальт

3
Так, саме ...
pacholik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.