2014-09-19 144 views
0

输入文件我有看起来像这样搜索字符串

Topic1 
Some text 
Topic2 
Some text 
Topic3 
Some text 

我需要去TOPIC2然后更换“一些文本”与“实际投入”

以下脚本作品

/Topic2/,/Topic/ { 
/Some text/c 
Actual input 
} 

有没有更简单的方法来做到这一点。我希望以下将起作用,但事实并非如此。

/Topic2/ { 
/Some text/c 
Actual input 
} 

更新:应该已经说得更清楚了。我只是在寻找基于sed的解决方案。

回答

1

这可能为你工作(GNU SED):

sed -e '/Topic2/,/Topic/{//!d;/Topic2/a\bla\nbla\nbla' -e '}' file 

或:

sed -e '/Topic2/,/Topic/{//!d;/Topic2/r fileb' -e '}' filea 

,或者使用Bash:

sed $'/Topic2/,/Topic/{//!d;/Topic2/a\\bla\\nbla\\nbla\n}' file 

编辑:

sed $'/Topic2/{:a;n;/Some text/!ba;c\\Actual input\n}' file 
+0

看起来像 “范围”(/ start_range /,/ end_range /)是这样做的唯一途径。我给出的第二个例子不起作用。 – user1074593 2014-09-22 21:46:14

+0

@ user1074593请参阅编辑 – potong 2014-09-23 12:28:56

1

用awk怎么样?

awk 'p&&/Topic/{p=0}/Topic2/{p=1}p{gsub(/Some text/,"foo\nbar\nbla\nline")}7' file 

以上我使用多行替换为例如,与输入输出将是:

Topic1 
Some text 
Topic2 
foo 
bar 
bla 
line 
Topic3 

可以传递替换字符串来awk的作为壳变量,使得AWK单班轮将是灵活的。像:

kent$ r="a 
b 
c" 

kent$ awk -v rep="$r" 'p&&/Topic/{p=0}/Topic2/{p=1}p{gsub(/Some text/,rep)}7' f 
Topic1 
Some text 
Topic2 
a 
b 
c 
Topic3 
Some text 
0

这里是一个gnu awk解决方案:

awk -v RS="Topic[0-9]*" 'f=="Topic2" {$0="\nActual input\n"} NR>1{print f,$0} {f=RT}' file 
Topic1 
Some text 

Topic2 
Actual input 

Topic3 
Some text