可以使用如下命令将单词“before”替换为单词“begin”和“end”之间的“before”之前的单词“after”之后:sed中的单词对
sed的 '/开始/,/结束/ {S /前/后/ G}'
我正在寻找一种方式,只有当他们做的 “后”, “前” 的替代不是发生在一对“开始”和“结束”里面。
可以使用如下命令将单词“before”替换为单词“begin”和“end”之间的“before”之前的单词“after”之后:sed中的单词对
sed的 '/开始/,/结束/ {S /前/后/ G}'
我正在寻找一种方式,只有当他们做的 “后”, “前” 的替代不是发生在一对“开始”和“结束”里面。
反转几乎是微不足道的:
sed '/begin/,/end/ !s/before/after/g'
注意,给出下面的输入
begin before end
before
end
before
begin
before end
before
end
before
你的原剧本给人的输出:
begin after end
after
end
before
begin
after end
before
end
before
注意“结束'与'开始'在同一行不会关闭替换。 (如果你用“结束之前,”后“开始”,在“前”仍然被“后”取代。)
该工作的正确工具是awk
而不是sed
。要做到同样的事情,你目前的sed
:
echo 'before
begin
before
end
before' | awk '
BEGIN {st=0;}
/begin/ {st=1;}
/end/ {st=0;}
{
if (st==1) {
gsub("before","after");
print;
} else {
print
}
}'
会给你:
before
begin
after
end
before
如果颠倒了if
语句控制gsub
的感觉,你会得到你想要的东西:
echo 'before
begin
before
end
before' | awk '
BEGIN {st=0;}
/begin/ {st=1;}
/end/ {st=0;}
{
if (st==0) {
gsub("before","after");
print;
} else {
print
}
}'
会给你:
after
begin
before
end
after
-1,因为sed的版本完全是微不足道的,而且比AWK – 2009-08-09 11:15:23
awk '/begin/{f=1}/end/{f=0}!f{ gsub("before","after")}1' file
更合适在地址范围的开始处有一个超级's'。 – 2009-08-09 11:17:42
@威廉 - 你说得对;修好了,谢谢! – 2009-08-09 15:31:22