How to add a new line to the beginning and end of every line matching a pattern?

时间:2017-12-17 08:10:58

标签: regex sed

How can sed be used to add a \n to the beginning and to the end of every line matching the pattern %%###? This is how far I got:

If foo.txt contains

foobar
%%## Foo
%%### Bar
foobar

then sed 's/^%%###/\n&\n/g' foo.txt gives

foobar
%%## Foo

%%###
 Bar
foobar

instead of

foobar
%%## Foo

%%### Bar

foobar

Note: This seems related to this post

Update: I'm actually looking for case where lines starting with the pattern are considered only.

4 个答案:

答案 0 :(得分:1)

It is cumbersome to directly add newlines via sed. But here is one option if you have perl available:

$ foo.txt | perl -pe 's/(.*%%###.*)/\n$1\n/'

Here we capture every matching line, which is defined as any line containing the pattern %%### anywhere, and then we replace with that line surrounded by leading and trailing newlines.

答案 1 :(得分:1)

With GNU sed:

sed 's/.*%%###.*/\n&\n/' file

Output:

foobar
%%## Foo

%%### Bar

foobar

&: Refer to that portion of the pattern space which matched

If you want to edit your file "in place" use sed's option -i.

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed '/%%###/!b;G;i\\' file

对于那些符合条件的行,从保留空间附加一个换行符(默认保留空间包含换行符)并插入一个空行。

另一种方式:

sed -e '/%%###/!b;i\\' -e 'a\\' file

这次插入然后追加空行。

N.B。 ia必须后跟换行符,这可以通过将它们放在单独的-e调用中来实现。

第三种方式:

sed '/%%###/!b;G;s/.*\(.\)/\1&/' file

与第一种方式一样,从保留空间附加一个换行符,然后复制它,即修改后的当前行的最后一个字符,并将其添加到当前行。

另一种方式:

sed '/%%###/{x;p;x;G}' file

换到保留空间,打印换行符,换回并附加换行符。

N.B。如果保留空间可能不为空(前一个,xhHgG命令可能已更改它,则缓冲区可能在使用zap命令p打印(z)之前清除。

当然:

sed  '/%%###/s/^\|$/\n/g' file

答案 3 :(得分:0)

我个人使用字符串而不是regexp比较,因为你想要匹配的文本中没有repexp字符,如果你不希望它们被视为这样,只是在字符串周围打印换行而不是修改字符串本身:

awk '{print ($1=="^%%###" ? ORS $0 ORS : $0)}' file

以上内容适用于每个UNIX盒子上每个shell中的任何awk,如果你不想在连续的%%###行之间有多个空白行,或者如果现有的周围不想要添加空行,则可以轻松修改行已空白或您需要执行任何其他操作。