你有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
的.out
sed
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/'
当然,这将映射on
andiut
等等int
以及in
and out
; 您的问题是“您的数据中是否会出现这种奇怪现象”?如果是这样,那么这两个显式s///
命令更好。
最后,所有的正则表达式都可能受益于or$
之后,以确保替换只发生在行尾。in
out