SED 替换了一些首次出现(和范围)的模式

标签 sed replace range find-occurrences

是否可以使用 SED 更改此场景中出现的前 4 个(或更多)字符串(与 sed -r 's/[^[:space:]]*/TEST/4g' 相反)):

TEST TEST TEST TEST five six seven

我使用 AWK 两次反转单词顺序,但这很长,很复杂,我想只用 SED 来实现:

echo one two three four five six seven | awk '{for(i=NF;i>=1;i--) printf "%s ", $i;print ""}'  | sed -r 's/[^ ]*/TEST/4g' |  awk '{for(i=NF;i>=1;i--) printf "%s ", $i;print ""}'

也许还可以选择更改出现范围,例如 3-5、6-12,...?

输入示例为:

one two three four five six seven

eight nine ten eleven twelve thirteen fourteen

fifteen sixteen seventeen eighteen nineteen twenty twenty-one

最佳答案

单个AWK怎么样:

awk '{for(i=1;i<=NF;i++) if(i<5){$i="TEST"}; print}'

测试运行:

$ echo one two three four five six seven | awk '{for(i=1;i<=NF;i++) if(i<5){$i="TEST"}; print}'
TEST TEST TEST TEST five six seven

这个解决方案简短、可读且可维护。如果它不能满足您的要求,请添加一些有关您的具体问题的详细信息。


Perl等效解决方案:

perl -pe 's/\S+/$i++<4?"TEST":$&/ge'

测试运行:

$ echo one two three four five six seven | perl -pe 's/\S+/$i++<4?"TEST":$&/ge'
TEST TEST TEST TEST five six seven

maybe there is option to change ranges of occurence like 3-5, 6-12

AWK:

awk '{for(i=3;i<6;i++)$i="TEST";print}'

在新提供的输入文件上测试运行:

$ awk '{for(i=3;i<6;i++)$i="TEST";print}' input
one two TEST TEST TEST six seven
eight nine TEST TEST TEST thirteen fourteen
fifteen sixteen TEST TEST TEST twenty twenty-one

Perl:

perl -pe 's/\S+/++$c~~[3..5]?"TEST":$&/ge'

在新提供的输入文件上测试运行:

$ perl -pe '$c=0;s/\S+/++$c~~[3..5]?"TEST":$&/ge' input
Smartmatch is experimental at -e line 1. <== This is a warning that goes to STDERR
one two TEST TEST TEST six seven
eight nine TEST TEST TEST thirteen fourteen
fifteen sixteen TEST TEST TEST twenty twenty-one

关于SED 替换了一些首次出现(和范围)的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56627940/

相关文章:

linux - Sed - 删除所有脚本标签

C# 通过开始和结束位置替换部分字符串

python - 在 Python 中计算一定数量的值的范围

javascript - 释放鼠标时重置输入类型=范围

linux - 如何用 sed 替换未知字符 <?> ?

regex - sed 无法理解正确的 (?) 正则表达式

node.js - 在 Node 模块中搜索包含 with 语句的 javascript 文件?

python - 用两项替换列表中的一项

javascript - 使用 .replace() 时调用替换参数上的方法

python - 验证字符串是否仅包含一系列数字 Python 2.7