我想在包含字符串“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
):
/task Listen/+1
-- 在下面匹配“task Listen”的那一项上,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