Удалить несколько строк из нескольких файлов, используя sed - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь удалить строку, соответствующую следующему регулярному выражению, используя sed.

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

grep  -P '.*Society[ \t]*([0-9]*[ \t]*[0-9]*)[ \t]*bhavan$' *.ann 

Результаты:

file0122.ann:T324   Society 4520 4526   bhavan
file0126.ann:T225   Society 9191 9197   bhavan
file0319.ann:T84    Society 43 49   bhavan
file0376.ann:T65    Society 2611 2617   bhavan
file0627.ann:T171   Society 4104 4110   bhavan
file1159.ann:T87    Society 4073 4079   bhavan
file1533.ann:T150   Society 2787 2793   bhavan
file1582.ann:T80    Society 2548 2554   bhavan
file1813.ann:T115   Society 1213 1219   bhavan
file1876.ann:T163   Society 1998 2004   bhavan
file1879.ann:T165   Society 2513 2519   bhavan
file2521.ann:T109   Society 326 332 bhavan
file2537.ann:T100   Society 2574 2580   bhavan
file3725.ann:T109   Society 2988 2994   bhavan

Я использую следующую команду sed для удаления вышеуказанных строк из всех файлов

sed -i -e '/.*Society[ \t]*([0-9]*[ \t]*[0-9]*)[ \t]*bhavan$/d' *.ann

Но это ничего не делает.Кто-нибудь может сказать, что я делаю не так?

Спасибо

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Вы можете просто добавить переключатель -v в grep.Это будет инвертировать логику, то есть только выбирать строки, не соответствующие шаблону.

Из grep.info:

‘-v’
‘--invert-match’
     Invert the sense of matching, to select non-matching lines.  (‘-v’
     is specified by POSIX.)
0 голосов
/ 13 декабря 2018

Просто удалите ( и ) из регулярного выражения, поскольку их нет в вашем вводе.Вы говорите grep использовать PCRE (-P), где эти символы представляют группу захвата (которую вы не используете, и поэтому они избыточны), но затем вызываете sed без каких-либо специфических для RE опций, поэтому он использует BRE, гдеэти символы - буквальные символы..* в начале вашего регулярного выражения не делает ничего полезного, кстати, так что вы можете просто удалить это тоже.

0 голосов
/ 13 декабря 2018

Работает путем замены малого e на E, который включает в себя --regexp-extended regex в sed.

sed -i -E '/.*Society[ \t]*([0-9]*[ \t]*[0-9]*)[ \t]*bhavan$/d' *.ann
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...