替换关键字后面和距离内的字符

时间:2015-09-29 14:57:31

标签: regex sed

使用 sed ,如何在关键字后面替换字符,但在所述关键字结尾后的x个字符内。例如,假设字符串:

foo bar baz quz

我们假设关键字是bar,而字符 z 将替换为字符 t ,但只能在结尾的3个字符内关键字(不包括空格)。

期望的结果是:

foo bar bat quz

编辑:我想这里可能会指出扩展正则表达式的用法,但不确定如何使用。

sed -re 's/(::bar) some_regex_magic_here /' infile

2 个答案:

答案 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的扩展正则表达式标志,如有必要,可将其更改为您平台的扩展正则表达式标志。