在发生另一个字符串后在sed中搜索字符串

时间:2014-09-19 15:43:12

标签: sed

我的输入文件看起来像这样

Topic1
Some text
Topic2
Some text
Topic3
Some text

我需要转到Topic2然后替换"一些文字"使用"实际输入"

以下脚本有效

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

有没有更简单的方法来做到这一点。我希望以下内容可行,但事实并非如此。

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

更新:应该让它更清晰。我只是在寻找基于sed的解决方案。

3 个答案:

答案 0 :(得分: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

你可以将替换字符串作为shell变量传递给awk,这样awk one-liner就会灵活。像:

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

答案 1 :(得分: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

答案 2 :(得分: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