3

В длинном текстовом файле со списком dups-23Mar16.listing я хочу удалить строки, начинающиеся, например, с .local . Вот несколько строк в этом файле:

Desktop/Reisen/Italien/VillaLaBandita/images-hpz-urlaub/cimg0429.jpg
Desktop/Tiere/Italien/VillaLaBandita/images-hpz-urlaub/cimg0429.jpg
.local/share/files/eksteuer/ekst.odt

Из-за пределов этого файла я могу сделать это с помощью команды

sed  -e '/^\.[a-z]/d' dups-23Mar16.listing

и в буфере vi

:%!sed  -e '/^\.[a-z]/d'

Если я хочу удалить строки, начинающиеся с рабочего стола, я получаю

:%!sed  -e '/^Desktop/d'

Как я могу объединить обе команды в одну? Я старался

:%!(sed  -e '/^\.[a-z]/d';sed -e '/^Desktop/d')

но это не работает. Каково решение?

2 ответа2

6

Если вы действительно этого хотите, вы можете просто задать несколько параметров -e для sed следующим образом:

:%!sed -e '/^\.[a-z]/d' -e '/^Desktop/d'

Я просто не знаю, хотите ли вы этого только для некоторого опыта в sed или вы не знаете, что внутри vim есть ed, который знает все, что делает sed и даже больше ... и без запуска ненужного процесса:

g/^\(\.[a-z]\|Desktop\)/d
1

Если вы хотите сделать это в командной строке буфера vi, это должно работать - без sed:

:exe 'g/^Desktop/d'|g/^\.[a-z]/d

Вертикальная черта разделяет несколько команд в командной строке vi. g работает для обработки всего буфера, так как регулярные выражения должны квалифицировать команды удаления для работы с каждой соответствующей строкой. exe и кавычки необходимы для предотвращения глобальной ошибки рекурсии.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .