Roel Van de Paar Asked: 2022-05-14 22:44:21 +0800 CST2022-05-14 22:44:21 +0800 CST 2022-05-14 22:44:21 +0800 CST sed 或 awk:仅替换第 n 次出现的字符串 772 如何编写一个sed(或awk,或两者)将采用以下内容: echo '1 aa 2 2 3 bb 5 bb 2 5' | sed/awk ... 并且只替换第 n 次出现的字符串?例如第三次出现2或第二次出现bb? 所以预期的输出将是(例如,当替换第二次出现时bb)replaced: 1 aa 2 2 3 bb 5 replaced 2 5 输入字符串,替换字符串,n可以是任意输入。 bash awk 4 个回答 Voted Best Answer HatLess 2022-05-14T23:02:03+08:002022-05-14T23:02:03+08:00 用于sed更改的第二次出现bb $ sed 's/bb/new-bb/2' file 1 aa 2 2 3 bb 5 new-bb 2 5 或更改 2 的第三次出现 $ sed 's/2/12/3' file 1 aa 2 2 3 bb 5 bb 12 5 Stéphane Chazelas 2022-05-14T23:26:29+08:002022-05-14T23:26:29+08:00 要更改一行中的第 n次出现,请sed使用s/pattern/replacement/3@HatLess已经显示的语法。 要更改整个输入中的第 n次perl出现,您可以使用: perl -pse 'if($n>0) {s{pattern}{--$n ? $& : "replacement"}ge}' -- -n=3 αғsнιη 2022-05-14T22:59:20+08:002022-05-14T22:59:20+08:00 你awk可以这样做: awk -v str='bb' -v pos=2 -v rplc='newBB' ' { strPos=0 for(i=1; i<=NF; i++) if($i==str && (++strPos==pos) ) { $i=rplc; break } }1' infile 输出: 1 aa 2 2 3 bb 5 newBB 2 5 注意:上面假设只有一个单独的字符作为字段分隔符(默认:空格或制表符),否则连续的字段分隔符将挤成一个,或者您可以强制 awk 分别匹配每个单独的字段分隔符(因此 FS 必须强制为正则表达式模式): awk -F'[\t]' -v OFS='\t' -v str='bb' -v pos=2 -v rplc='newBB' ' { strPos=0 for(i=1; i<=NF; i++) if($i==str && (++strPos==pos) ) { $i=rplc; break } }1' infile 注意:\t如果字段分隔符是空格字符,则更改为空格字符。 要更改整个输入中的第 n次出现(但我假设字段分隔符是制表符): awk -F'[\t]' -v OFS='\t' -v str='bb' -v pos=2 -v rplc='newBB' ' strPos!=2{ for(i=1; i<=NF; i++) if($i==str && (++strPos==pos) ) { $i=rplc; break } }1' infile Praveen Kumar BS 2022-05-16T23:58:56+08:002022-05-16T23:58:56+08:00 我们可以sed在一个命令中做到这两点: echo "1 aa 2 2 3 bb 5 bb 2 5"|sed -e "s/2/kop/3" -e "s/bb/pp/2" 此命令将替换第 3 次出现的2withkop和第 2 次出现的bbwith pp。
用于
sed
更改的第二次出现bb
或更改 2 的第三次出现
要更改一行中的第 n次出现,请
sed
使用s/pattern/replacement/3
@HatLess已经显示的语法。要更改整个输入中的第 n次
perl
出现,您可以使用:你
awk
可以这样做:输出:
注意:上面假设只有一个单独的字符作为字段分隔符(默认:空格或制表符),否则连续的字段分隔符将挤成一个,或者您可以强制 awk 分别匹配每个单独的字段分隔符(因此 FS 必须强制为正则表达式模式):
注意:
\t
如果字段分隔符是空格字符,则更改为空格字符。要更改整个输入中的第 n次出现(但我假设字段分隔符是制表符):
我们可以
sed
在一个命令中做到这两点:此命令将替换第 3 次出现的
2
withkop
和第 2 次出现的bb
withpp
。