我的文件看起来像这样
...
%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解决方案。任何有解释的建议都将非常感激。
答案 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
---
...