如何使用特定模式sed一个文本块?

时间:2014-12-10 18:50:39

标签: regex bash sed

我的文件看起来像这样

...
%pythons
Albino
Black Bee
Bumble Bee
%end

%boa
Albino
Jungle
Pastel
%end
...

我想从这个文件匹配模式中获取整个块以用于保存或替换目的。块中的行数可能非常多。我需要共同的解决方案 我正在寻找类似的东西

sed -n '/^%boa(**something here**)^%end$//p' snakes > boa
sed 's/^%boa(**something here**)^%end$/(**new block**)/' snakes > snakes_updated

我特意寻找sed解决方案。任何有解释的建议都将非常感激。

4 个答案:

答案 0 :(得分:1)

如果我理解得很好,你可以这样做grouping commands

sed -i.bak '/^%boa/,/%end/ {
    wboas
    d
}' file

使用w command,您可以在addresses /^%boa/,/%end/与文件 boas 之间写入内容。
使用d command,您可以删除原始文件中的这些行(在-i option的帮助下)。

原始档案:

$ cat file
...
%pythons
Albino
Black Bee
Bumble Bee
%end

%boa
Albino
Jungle
Pastel
%end
...

实施例

$ sed -i.bak '/^%boa/,/%end/ {
>     wboas
>     d
> }' file

$ cat boas
%boa
Albino
Jungle
Pastel
%end

$ cat file
...
%pythons
Albino
Black Bee
Bumble Bee
%end

...

此外,如果您需要用其他内容替换该块(让我们说"hello\n world"),您可以使用a command附加它:

sed -i.bak '/^%boa/,/%end/ {
    wboas
    /^%boa/a \
    hello \
    world
    d
}' file

实施例

$ sed -i.bak '/^%boa/,/%end/ {
>     wboas
>     /^%boa/a \
>     hello \
>     world
>     d
> }' file

$ cat file
...
%pythons
Albino
Black Bee
Bumble Bee
%end

    hello 
    world
...

$ cat boas
%boa
Albino
Jungle
Pastel
%end

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -i -e '/%boa/,/%end/{w fileb' -e '/%end/!d;r filec' -e 'd}' filea

这会将%boa%end之间的部分写入fileb,并将其替换为filec的内容。使用-i标志将filea的内容替换为已编辑的操作。

答案 2 :(得分:0)

好像你想要这样的东西,

$ sed -n '/^%boa$/,/^%end$/p' file
%boa
Albino
Jungle
Pastel
%end

打印出属于特定范围的线条。

答案 3 :(得分:0)

使用perl -0,您可以轻松搜索并替换此文件中的一个块:

perl -0pe 's~(?ms)\R%boa.*%end(\R|\z)~\n---\nfoo\nbar\nbaz\n---\n~' file
...
%pythons
Albino
Black Bee
Bumble Bee
%end

---
foo
bar
baz
---
...