让我们说如下几行
ioctl
我想以相同的顺序搜索AAA CCC。因此预期结果将是
AAA BBB CCC DDD EEE FFF
BBB CCC EEE DDD FFF
HHH XXX TTT SSS PPP QQQ
...
是否有单行正则表达式来生成这些?
答案 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'