Sed替换每个文本块中word的第一个实例而不离开bash



我有一些包含可识别文本块的文本存储在变量$mytext:

start
This is my house and I can see my car from it.
This is my dog and it dislikes squirrels.
end
start
This is my car and I can see my house from it.
This is my dog and it dislikes squirrels.
end

我只想替换第一个"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

那么我得到的是:

sed -zE "/start/, /end/ s/my/our/1;q" <<< $mytext

但是这只会替换第一个"my"并忽略"my"在第二个街区。我认为这是因为它正在寻找第一个"起点"。最后的"结束";所以只做一次替换。

当然,$mytext中的文本是我实际尝试做的一个更简单的版本,但它是用来说明这一点的

如何替换"my"的第一个实例在两个街区里不离开巴斯吗?

对于sed,首先用唯一的字符替换my字符串。
下一个"normal"sed命令,您可以替换start之后的第一个唯一字符。
现在将剩余的临时字符恢复为原始值。

sed -zE 's/ my /r/g;s/(start[^r]*)r/1 our /g;s/r/ my /g' file

如果你想给awk一个机会,那么使用:

awk 'p==1 {p += sub(/my/, "our")} /^start$/ {p=1} /^end$/ {p=0} 1' file
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

最新更新