2009-08-09 32 views
1

可以使用如下命令将单词“before”替换为单词“begin”和“end”之间的“before”之前的单词“after”之后:sed中的单词对

sed的 '/开始/,/结束/ {S /前/后/ G}'

我正在寻找一种方式,只有当他们做的 “后”, “前” 的替代不是发生在一对“开始”和“结束”里面。

回答

1

反转几乎是微不足道的:

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 

注意“结束'与'开始'在同一行不会关闭替换。 (如果你用“结束之前,”后“开始”,在“前”仍然被“后”取代。)

+0

更合适在地址范围的开始处有一个超级's'。 – 2009-08-09 11:17:42

+0

@威廉 - 你说得对;修好了,谢谢! – 2009-08-09 15:31:22

0

该工作的正确工具是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 
+0

-1,因为sed的版本完全是微不足道的,而且比AWK – 2009-08-09 11:15:23

0
awk '/begin/{f=1}/end/{f=0}!f{ gsub("before","after")}1' file 
相关问题