是否可以使用 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/