如何在与模式匹配的每一行的开头和结尾添加新行?

问题描述 投票:2回答:4

如何使用sed\n添加到与%%###模式匹配的每一行的开头和结尾?这是我得到了多远:

如果foo.txt包含

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

然后sed 's/^%%###/\n&\n/g' foo.txt给出

foobar
%%## Foo

%%###
 Bar
foobar

代替

foobar
%%## Foo

%%### Bar

foobar

注意:这似乎与this post有关

更新:我实际上是在寻找仅考虑以模式开头的行的情况。

regex sed
4个回答
1
投票

使用GNU sed:

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

输出:

foobar
%%## Foo

%%### Bar

foobar

&:参考匹配的模式空间部分

如果要“就地”编辑文件,请使用sed的选项-i


1
投票

通过sed直接添加换行很麻烦。但是如果你有perl,这里有一个选项:

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

这里我们捕获每个匹配的行,它被定义为任何地方包含模式%%###的任何行,然后我们用前导和尾随换行包围的那行替换。


1
投票

这可能适合你(GNU sed):

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

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

其他方式:

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

这次插入然后追加空行。

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

第三种方式:

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

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

另一种方式:

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

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

注:如果保持空间可能不为空(前一个,xhHgG命令可能已更改它),则可以使用zap命令p清除缓冲区(z)之前清除缓冲区。

而且当然:

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

0
投票

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

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

上面的内容适用于每个UNIX盒子上的每个shell中的任何awk,如果你不想在连续的%%###行之间有多个空白行,或者如果现有的周围行已经空白或者你需要不想要添加空行,则可以很容易地修改做其他事情。

© www.soinside.com 2019 - 2024. All rights reserved.