如何在Bash中用Sed替换每个文本块的首个指定单词
解决方法
你的问题出在原命令里的q选项——它会让sed处理完第一个匹配内容就直接退出,自然不会处理第二个start-end块;另外-z参数将整个文本作为单行读取,也不利于按独立块处理。
可以用以下sed命令实现需求,无需离开Bash:
sed -E ' /start/{ :process_block N /end/!b process_block s/my/our/1 } ' <<< "$mytext"
命令解释:
/start/{...}:匹配到包含start的行时,执行花括号内的逻辑:process_block:定义一个循环标记N:读取下一行并追加到当前模式空间/end/!b process_block:如果当前模式空间里还没出现end,就跳回process_block标记继续读取行,直到把整个start-end块都读进来s/my/our/1:在整个块的内容里,只替换第一个出现的my为our
执行后,文本会被处理成:
start This is our house and I can see my car from it. This is my dog and it dislikes squirrels. end start This is our car and I can see my house from it. This is my dog and it dislikes squirrels. end
内容的提问来源于stack exchange,提问作者rolandw
相关产品推荐
相关产品推荐

