替换sed中的多行模式

时间:2011-11-17 09:11:54

标签: sed

我只是想做以下

替换

EXTRATHING {
};

通过

SOMETHING {};
输入文件中的

。为此,我试过

sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt  >outfile.txt

这不起作用。有人可以建议用sed做这个的正确方法吗?

6 个答案:

答案 0 :(得分:6)

sed -n '1h;1!H;${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}' input_file.txt

会这样做。

这个问题是它将整个输入字符串存储在sed的缓冲区中。

有关详情和更高效的版本,请参阅sed and Multi-Line Search and Replace

答案 1 :(得分:3)

 sed -i.bak '/EXTRATHING/{N;s//SOMETHING/;s/\n//}' input_file.txt

答案 2 :(得分:2)

sed -e '/begin/,/end/{s/begin/replacement/p;d}'

答案 3 :(得分:1)

perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' your_file

测试如下:

> cat temp
fjbwjfbw
wefjkbwjk
jbefwejr
EXTRATHING {
};
ghekg
jhgjk
wefjkwngk
EXTRATHING {
  };
jbgvjnrg
jbfw
wefnkwk
EXTRATHING {
};
> perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' temp
fjbwjfbw
wefjkbwjk
jbefwejr
SOMETHING{};
ghekg
jhgjk
wefjkwngk
SOMETHING{};
jbgvjnrg
jbfw
wefnkwk
SOMETHING{};
> 

如果要更改内联文件。添加-i标志。 喜欢:

perl -i -lne '.......' your_file

答案 4 :(得分:1)

在sed中很难做到,需要编写下标。 但是,您可以使用perl:

使用单行程序
perl -0777 -pe 's/EXTRATHING {\n/SOMETHING {/g' input_file.txt > outfile.txt

,其中 -0777是记录分隔符(文本文件中的结束) -p运行所有文件的命令并在屏幕上打印 -e说这是一个单行命令

答案 5 :(得分:0)

这可能对您有用:

 sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file.txt >output_file.txt

或者如果您想编辑原始文件:

sed -i '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file

编辑:根据要求,这是一个例子:

cat <<! | sed '/^EXTRATHING {/,/^};/c\SOMETHING{}'
> aaa
> EXTRATHING {
> };
> bbb
> EXTRATHING {
> };
> ccc
> !
aaa
SOMETHING{}
bbb
SOMETHING{}
ccc

编辑:如果第一个和最后一个地址是连续的行,请使用:

# cat <<\! | sed '/^EXTRATHING {/{N;s/^EXTRATHING {\n};/SOMETHING{}/}'
> aaa
> EXTRATHING {
> bbb
> };
> ccc
> EXTRATHING {
> };
> ddd
> !
aaa
EXTRATHING {
bbb
};
ccc
SOMETHING{}
ddd

另一种方式(也许更容易?):

echo -e "EXTRATHING {\n};" | sed '$!N;s/^EXTRATHING {\n};/SOMETHING {};/;P;D'
SOMETHING {};