Answers:
您可以为大多数sed命令加上地址前缀,以限制它们所应用的行。地址可以是行号或以分隔的正则表达式/
。
cat INPUT | sed '/Select ASDF/ s=sdfg=XXXX='
如Peter.O所述,上面编写的命令将替换sdfg
包含的字符串中any的第一个匹配项Select ASDF
。如果sdfg
仅在第四列中需要将完全匹配替换为,则应采用以下方式:
cat INPUT | sed 's/\(^Select ASDF [^ ]* \)sdfg /\1XXXX /'
g
最后输入=
(在s
命令末尾)。它将是这样的:sed '/Select ASDF/ s=sdfg=XXXX=g'
如果仅更改第4列的值,则使用相等运算符代替正则表达式是有意义的。
awk '$1 == "Select" && $2 == "ASDF" && $4 == "sdfg" {$4 = "XXXX"} {print}'
使用GNU awk
:
awk '
BEGIN { IGNORECASE = 1 }
/^select asdf/ {
sub( /\<sdfg\>/, "XXXX", $0 )
}
{ print }
' infile
输出:
Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg
更新:避免IGNORECASE
使用非GNU awk
并区分大小写。感谢jw013,他指出了这一细节:
awk '
/^Select ASDF/ {
sub( /\<sdfg\>/, "XXXX", $0 )
}
{ print }
' infile
IGNORECASE
是一个GNU awk
/ gawk
扩展。
ASDF