替换特定行后的字符串

替换特定行后的字符串

我想在包含字符串“task Listen”的行之后将字符串“edit TRIES 2”替换为“edit TRIES 3”

  task Listen
    edit TRIES 2

我怎样才能用 sed 做到这一点?字符串“edit TRIES 2”在文件中出现多次,因此我无法进行简单的 sed 替换,因为我想替换该特定行。

答案1

简单点怎么样

sed '/task Listen/{n; s/edit TRIES 2/edit TRIES 3/}' file

前任。给定

$ cat file
    edit TRIES 2
    edit TRIES 2
  task Listen
    edit TRIES 2
    edit TRIES 2

然后

$ sed '/task Listen/{n; s/edit TRIES 2/edit TRIES 3/}' file
    edit TRIES 2
    edit TRIES 2
  task Listen
    edit TRIES 3
    edit TRIES 2

答案2

或者使用可编写脚本的编辑器ed:搜索包含“task Listen”的行,超越它,并将任何“edit TRIES 2”替换为“edit TRIES 3”:

printf '%s\n' '/task Listen/+1 s/edit TRIES 2/edit TRIES 3/' 'wq' | ed -s file

发送printf两个换行符分隔的命令到ed(被告知用 抑制诊断-s):

  1. /task Listen/+1-- 在下面匹配“task Listen”的那一项上,
  2. s/edit TRIES 2/edit TRIES 3/-- 将任何“编辑 TRIES 2”替换为“编辑 TRIES 3”

如果“task Listen”后面的行确实不是包含“edit TRIES 2”,ed将失败退出(并且不更改文件)。

答案3

这是我的尝试:

sed -E 'N;s/([[:blank:]]*task Listen\n[[:blank:]]*edit TRIES )[0-9]*)/\13/' file

使用扩展正则表达式:

sed -E

使用命令N(换行)

'N;

如果开头是空格或制表符,则在任何重复中匹配并捕获这两行:

([[:blank:]]*task Listen\n[[:blank:]]*edit TRIES )[0-9]*

将字符串替换为捕获的模式和所需的字符串,在本例中3

/\13/

答案4

尝试使用下面的命令,效果很好

命令

sed -n '/task Listen/,+1p' filename| sed "s/edit TRIES 2/edit TRIES 3/g"

输出

task Listen
    edit TRIES 3

相关内容