使用sed从多个文件中删除多行

时间:2018-12-13 10:03:20

标签: regex perl sed grep command

我正在尝试使用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 :(得分:2)

您只需将-v开关添加到grep。这将颠倒逻辑,即仅选择与模式不匹配的线。

来自grep.info

‘-v’
‘--invert-match’
     Invert the sense of matching, to select non-matching lines.  (‘-v’
     is specified by POSIX.)

答案 1 :(得分:1)

只需从正则表达式中删除)-P,因为它们不在您的输入中。您要告诉grep使用PCRE(.*),其中这些括号代表捕获组(您没有使用它们,因此它们是多余的),然后调用sed而不使用任何特定于RE的选项,因此它使用的是BRE其中那些括号是文字字符。顺便说一句,正则表达式开始处的let array = []; let count = 1; for(let i = 1; i < 15; i++){ if(i == count){ break }else{ array.push(i); } count++; } 并没有做任何有用的事情,因此您也可以删除它。

答案 2 :(得分:0)

通过将小e更改为E来工作,其中包括--regexp扩展了sed中的regex。

BaseMainActivity