我必须在一个模式中将一些内容从一个file1替换为file2 文件1
/* start */
abc
/* end */
file2的
/* start */
xyz
/* end */
结果应该在file2
中/* start */
abc
/* end */
我为实现这一目标所做的工作如下:
sed -n "/start/,/end/p" file1 >> sed -i 's/start.*end/start end/g' file2
但是上面附加在file2中。请指导
答案 0 :(得分:1)
如果你想改变字符串从开始到结束之间的行从Input_file1到Input_file2,那么下面的内容可以帮助你。
awk 'FNR==NR{if($0 ~ /^\/\* start \*\//){flag=1;next};if($0 ~ /\/\* end \*\//){flag=""};if(flag){val=val?val ORS $0:$0};next} /^\/\* start \*\//{flag2=1;print;next} /\/\* end \*\//{flag2=""} flag2{$0=val;flag2=""} 1' Input_file1 Input_file2
现在也添加非单线形式的解决方案。
awk '
FNR==NR{
if($0 ~ /^\/\* start \*\//){
flag=1;
next};
if($0 ~ /\/\* end \*\//){
flag=""};
if(flag){
val=val?val ORS $0:$0};
next
}
/^\/\* start \*\//{
flag2=1;
print;
next}
/\/\* end \*\//{
flag2=""}
flag2{
$0=val;
flag2=""
}
1' Input_file1 Input_file2
如果您想将输出保存到Input_file2本身,请将> temp_file && mv temp_file Input_file2
附加到上面代码的最后一行。
答案 1 :(得分:1)
你想要从file2到/start/
的行,接下来是file1之间的行,最后是文件2中的结果行。
忽略边界时,这将是
(
sed -n "1,/start/p" file2
sed -n "/start/,/end/p" file1
sed -n "/end/,$ p" file2
) > /tmp/outputfile
边界问题是双开始/停止标记,当file2以/start/
开头或以/end/
结尾时会发生什么。
您可以使用
(
sed "/start/,$ d" file2
sed -n "/start/,/end/p" file1
sed "1,/end/ d" file2
) > /tmp/outputfile
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed -n '/start/,/end/p' file1 |
sed -e '/start/,/end/{/end/r /dev/stdin' -e 'd}' file2
将第一个文件的start
和end
之间的输出传递给stdout。删除第二个文件中start
和end
之间的所有行,并在遇到end
时将其替换为stdin的内容。