我的输入文件看起来像这样
Topic1
Some text
Topic2
Some text
Topic3
Some text
我需要转到Topic2然后替换"一些文字"使用"实际输入"
以下脚本有效
/Topic2/,/Topic/ {
/Some text/c
Actual input
}
有没有更简单的方法来做到这一点。我希望以下内容可行,但事实并非如此。
/Topic2/ {
/Some text/c
Actual input
}
更新:应该让它更清晰。我只是在寻找基于sed的解决方案。
答案 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