используя sed для удаления строк в файле

1811
eleven81

У меня есть файл, который выглядит примерно так:

Heading -  - Completed foo - More information - Still more * Need to complete bar - Did baz (comment blah blah) ***  Another -  * Need to complete foo - Completed bar (blah comment blah) *** - Done baz 

Мне нужно запустить текстовый файл sedдо конца, чтобы удалить все строки, начинающиеся с пробелов (число варьируется), дефис и еще один пробел.

Какое регулярное выражение или шаблон мне нужно использовать, sedчтобы вывод выглядел следующим образом?

Heading -  * Need to complete bar  Another -  * Need to complete foo 
1

4 ответа на вопрос

3
eleven81

Я использовал ответ Фоши, которому помог Деннис Уильямсон, чтобы помочь мне придумать, sed /^\s+-\s.*/dчто работает, как и ожидалось.

Вы можете использовать `+` вместо `*`, чтобы убедиться, что есть хотя бы один пробел. Dennis Williamson 14 лет назад 0
2
Phoshi

"s/\s*-\s.*//g" Я должен сделать это, я думаю.

Это \ s, чтобы соответствовать пробелу, *, чтобы соответствовать нулю или более предыдущего символа (пробел), буквальный символ дефиса, затем другой пробел, затем. +, Чтобы соответствовать всему после него.

Близко. Очень близко! Это оставляет пустые строки. Не удаляет возврат каретки / перевод строки. eleven81 14 лет назад 0
черт! Попробуйте добавить \ s к строке поиска, тогда, боюсь, я не выполняю достаточно работы над полными строками: P Phoshi 14 лет назад 0
1

Вы должны использовать egrep или grep для этой задачи, sed - это потоковый редактор, grep больше соответствует философии line-at-time.

Вам нужно регулярное выражение, которое соответствует началу строки, пробела, дефиса, пробела. Похоже, это будет работать:

egrep -v '^[ ]+-[ ]' filename 

-vОпция заставляет УДАЛИТЬ задать расширенную совпадающие строки - это проще, чем построить регулярное выражение, которое отторгает линию.

Пример:

 nobody$ egrep -v '^[ ]+-[ ]' /tmp/foof Heading -  * Need to complete bar  Another -  * Need to complete foo nobody$ cat /tmp/foof Heading -  - Completed foo - More information - Still more * Need to complete bar - Did baz (comment blah blah) ***  Another -  * Need to complete foo - Completed bar (blah comment blah) *** - Done baz nobody$ _ 

Работа с символами табуляции только означает, что они нужны в выражениях в скобках, но это трудно показать в Интернете.

С вкладками: `egrep -v $ '^ [\ t] + - [\ t]' / tmp / foof` Dennis Williamson 14 лет назад 0
0
Ryan Thompson

Для фильтрации целых строк из вывода, как правило, вы хотите grep, а не sed. В частности, чтобы исключить определенные строки, вы захотите использовать grep -v 'exclusion-regex'.

я не вижу _why_ one _wants_ 'grep' вместо 'sed' .. за исключением более сложного синтаксиса. Итак, почему использование grep для фильтрации содержимого лучше, чем команда 'sed' команды 'd'? akira 14 лет назад 1

Похожие вопросы