你有3个例子:
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/'
这应该适用于结尾的行in。
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/ out/ out/'
这将失败并出现来自sed. 第一部分是一个有效的s///命令,直到第二个之后的斜线in;其余的应该是一个新命令,例如:
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/; s/:[^:]* out/ out/'
这应该适用于任何版本in的.outsed
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* in/ in/ || out/ out/'
与之前的诊断一样,第一个之后的材料s///根本无效sed。
标准sed使用正则表达式的中等功率版本,但它不是完整的 ERE(扩展正则表达式)。特别是,它不支持交替(或'd 替代)。
一些现代版本sed(尤其是 GNU sed)支持 ERE 甚至 PCRE(Perl 兼容的正则表达式)。
egrep -w 'TCP|UDP' denied.txt | sed -r 's/:[^:]* (in|out)/ \1/'
如果做不到这一点,要使用单个替代品处理“输入”和“输出”,您可以使用:
egrep -w 'TCP|UDP' denied.txt | sed 's/:[^:]* \([io][nu]t\{0,1\}\)/ \1/'
当然,这将映射onandiut等等int以及inand out; 您的问题是“您的数据中是否会出现这种奇怪现象”?如果是这样,那么这两个显式s///命令更好。
最后,所有的正则表达式都可能受益于or$之后,以确保替换只发生在行尾。inout