首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换关键字后面和距关键字的距离范围内的字符

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

Stack Overflow用户
提问于 2015-09-29 14:57:31
回答 2查看 51关注 0票数 0

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

foo bar baz quz

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

预期的结果将是:

foo bar bat quz

编辑:我想扩展正则表达式的用法可以在这里说明,但不确定如何使用。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-29 15:29:27

使用awk,您可以:

代码语言:javascript
复制
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"

输出:

代码语言:javascript
复制
foo bar bat quz

更多测试:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-09-29 15:15:20

您可以通过以下命令来完成这一任务:

代码语言:javascript
复制
sed -E 's/(bar[[:space:]]*(.[[:space:]]*){0,2})z/\1t/'`

示例:

代码语言:javascript
复制
echo "foo bar baz quz" | sed -E 's/(bar[[:space:]]*(.[[:space:]]*){0,2})z/\1t/'

它的工作方式是捕获bar,后面跟着任意数量的空格,但最多只有2个非空白字符,然后是z,然后用捕获组1替换它,然后是t-E是OSX的扩展regex标志,必要时将其更改为extended标志。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32847326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档