使用 sed ,如何在关键字后面替换字符,但在所述关键字结尾后的x个字符内仅。例如,假设字符串:
foo bar baz quz
我们假设关键字是bar
,而字符 z 将替换为字符 t ,但只能在结尾的3个字符内关键字(不包括空格)。
期望的结果是:
foo bar bat quz
编辑:我想这里可能会指出扩展正则表达式的用法,但不确定如何使用。
sed -re 's/(::bar) some_regex_magic_here /' infile
答案 0 :(得分:1)
使用awk你可以这样做:
s="foo bar baz quz"
awk -v kw='bar' -v pos=3 'p=index($0, kw){n=p+length(kw)+1; s=substr($0, n, pos);
gsub(/z/, "t", s); $0=substr($0, 1, n-1) s substr($0, n+pos)} 1' <<< "$s"
<强>输出:强>
foo bar bat quz
更多测试:
s='foo bar bzz quz'
awk -v kw='bar' -v pos=3 'p=index($0, kw){n=p+length(kw)+1; s=substr($0, n, pos);
gsub(/z/, "t", s); $0=substr($0, 1, n-1) s substr($0, n+pos)} 1' <<< "$s"
foo bar btt quz
答案 1 :(得分:0)
您可以使用以下命令完成此操作:
sed -E 's/(bar[[:space:]]*(.[[:space:]]*){0,2})z/\1t/'`
示例:
echo "foo bar baz quz" | sed -E 's/(bar[[:space:]]*(.[[:space:]]*){0,2})z/\1t/'
它的工作原理是捕获bar
后跟任意数量的空格,但最多只有2个非空白字符,然后z
,并将其替换为捕获组1,后跟t
。 -E
是OSX的扩展正则表达式标志,如有必要,可将其更改为您平台的扩展正则表达式标志。