sed - 如何使用 sed 替换第 n 次出现的字符串

标签 sed

有没有办法使用 sed 替换文件中第 n 次出现的字符串?

我使用 sed -i '0,/jack.*/s//jill/' 来替换第一个匹配项。

如何更改它以替换第 n 次出现?

我的文件包含以下几行:

first line
second line
third line
jack=1
fifth line
jack=
seventh line

我不知道jack=后面的值,它可以是任何东西,也可以什么都没有。

我想将第二次出现的 jack= 及其后面的任何内容替换为 jill

最佳答案

首先使用 tr 将所有换行符替换为文件中其他任何位置都没有出现的唯一字符(例如 ^)。您需要执行此操作才能为 sed 创建单个字符串。然后将其传递给 sed 并告诉它替换第 n 次出现的字符串。最后,通过 tr 将输出传回以重新创建换行符。

对于 n=2,命令为:

$ tr '\n' '^' < file | sed 's/jack/jill/2' | tr '^' '\n'
first line
second line
third line
jack
fifth line
jill
seventh line

更新:

也可以使用 sed 来完成,无需先更改换行符,使用以下命令:

$ sed ':a;N;$!ba;s/jack/jill/2' file

或者,使用awk:

$ awk '/jack/{c+=1}{if(c==2){sub("jack","jill",$0)};print}' file

关于sed - 如何使用 sed 替换第 n 次出现的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817798/

相关文章:

linux - 键值对中所有值的 SED

linux - 根据特定顺序重新排列文件中模式后的行

shell - 如何合并多行以根据字段分隔符恰好创建两条记录?

mysql - sed 中的变量替换

ANT 中的 Bash 脚本用于删除文件中的文本

awk - 查找、替换和移动包含特定字符串的行

shell - 逐行打印 $PATH

sed - 如何删除文件中的重复行...AWK、SED、UNIQ 不适用于我的文件

regex - sed 滑动窗口替换

regex - Shell 脚本 - 列出文件、读取文件并将数据写入新文件