使用正则表达式以随机顺序搜索关键字集

时间:2018-10-31 19:04:40

标签: regex sed

让我们说如下几行

ioctl

我想以相同的顺序搜索AAA CCC。因此预期结果将是

AAA BBB CCC DDD EEE FFF
BBB CCC EEE DDD FFF
HHH XXX TTT SSS PPP QQQ
...

是否有单行正则表达式来生成这些?

1 个答案:

答案 0 :(得分:0)

这可能对您有用(GNU sed):

sed -n '/AAA\/BBB/{s/\(AAA \?\)\|\(CCC\).*\|./\1\2/g;s/ $//;p}' file

revo 建议的此解决方案保持了目标字符串的顺序,请参阅下文了解不存在的解决方案及其改进解决方案所基于的描述。

sed -n '/AAA\|BBB/!b;s/\(AAA \?\|CCC \?\)\|./\1/g;s/ $//;p' file

-n选项设置为有选择地打印图案空间。如果当前行不包含目标字符串,则不执行任何操作并将其替换为下一行。否则,用其自身替换目标(后跟零或一个空格),或全局删除模式空间中的下一个字符。最后删除所有尾随空格并打印图案空间。感谢 revo 的初衷。

这不是一行正则表达式

grep -o 'AAA\|CCC' file

将从每行中提取目标字符串,但是如果每行中有多个匹配项,则每行将打印多次,如使用-n选项所见:

grep -no 'AAA\|CCC'  file

如果文件很大,则grep和sed的组合可能会更有效:

grep -hnow 'AAA\|CCC' file |
sed -r ':a;$!N;s/^(([^:]*:).*)\n\2/\1 /;ta;s/^[^:]*://;P;D'