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.
答案 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。 i
和a
必须后跟换行符,这可以通过将它们放在单独的-e
调用中来实现。
第三种方式:
sed '/%%###/!b;G;s/.*\(.\)/\1&/' file
与第一种方式一样,从保留空间附加一个换行符,然后复制它,即修改后的当前行的最后一个字符,并将其添加到当前行。
另一种方式:
sed '/%%###/{x;p;x;G}' file
换到保留空间,打印换行符,换回并附加换行符。
N.B。如果保留空间可能不为空(前一个,x
,h
,H
,g
或G
命令可能已更改它,则缓冲区可能在使用zap命令p
打印(z
)之前清除。
当然:
sed '/%%###/s/^\|$/\n/g' file
答案 3 :(得分:0)
我个人使用字符串而不是regexp比较,因为你想要匹配的文本中没有repexp字符,如果你不希望它们被视为这样,只是在字符串周围打印换行而不是修改字符串本身:
awk '{print ($1=="^%%###" ? ORS $0 ORS : $0)}' file
以上内容适用于每个UNIX盒子上每个shell中的任何awk,如果你不想在连续的%%###
行之间有多个空白行,或者如果现有的周围不想要添加空行,则可以轻松修改行已空白或您需要执行任何其他操作。