我有一些包含可识别文本块的文本存储在变量$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