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

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

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 удалить все строки, которые запускаются с пробелов (число варьируется), и дефис и другое пространство.

Каковы regex или шаблон, с которым я должен использовать sed заставить вывод быть похожим на это ниже?

Heading - 
  * Need to complete bar

Another - 
  * Need to complete foo
1
задан 29.07.2015, 23:42

4 ответа

Я использовал ответ Phoshi, которому помогает Dennis Williamson, чтобы помочь мне придумать sed /^\s+-\s.*/d который работает как ожидалось.

3
ответ дан 12.12.2019, 08:17
  • 1
    Вы могли использовать + вместо * для проверки существует по крайней мере одно пространство. опечатка – Paused until further notice. 06.11.2009, 20:39

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

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

2
ответ дан 12.12.2019, 08:17
  • 1
    Близко. Очень близко! Это оставляет незаполненные строки. Это не удаляет возврат каретки / перевод строки. – eleven81 06.11.2009, 18:03
  • 2
    чертовски! Попытайтесь добавить \s к строке поиска, затем, я боюсь, что не делаю достаточной работы над сплошными линиями :P – Phoshi 06.11.2009, 19:45

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

Вам нужен regex, который соответствует запуску строки, пробела, дефиса, пространства. Кажется, что это работало бы:

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

-v опция заставляет egrep УДАЛЯТЬ согласующие отрезки длинной линии - это легче, чем создание regex, который отклоняет строки.

Пример:

 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$ _

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

1
ответ дан 12.12.2019, 08:17
  • 1
    With: egrep -v $'^[ \t]+-[ \t]' /tmp/foof – Paused until further notice. 06.11.2009, 20:36

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

0
ответ дан 12.12.2019, 08:17
  • 1
    , который я не вижу, почему каждый хочет 'grep' вместо 'sed'.. за исключением более сложного синтаксиса. таким образом, почему использует grep для того, чтобы фильтровать материал лучше, чем 'd' команда 'sed'? – akira 06.11.2009, 19:19

Теги

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