Regex 如何在与图案匹配的每一行的开头和结尾添加新行?

Regex 如何在与图案匹配的每一行的开头和结尾添加新行?,regex,sed,Regex,Sed,如何使用sed将\n添加到与模式%\code>匹配的每一行的开头和结尾?这就是我取得的成绩: 如果foo.txt包含 foobar %%## Foo %%### Bar foobar 然后sed的/^%%###/\n&\n/g'foo.txt给出 foobar %%## Foo %%### Bar foobar 而不是 foobar %%## Foo %%### Bar foobar 注意:这似乎与 更新:我实际上在寻找只考虑以模式开头的行的情况。通过sed直接添加新行很麻烦。但如

如何使用
sed
\n
添加到与模式
%\code>匹配的每一行的开头和结尾?这就是我取得的成绩:

如果
foo.txt
包含

foobar
%%## Foo
%%### Bar
foobar
然后
sed的/^%%###/\n&\n/g'foo.txt
给出

foobar
%%## Foo

%%###
 Bar
foobar
而不是

foobar
%%## Foo

%%### Bar

foobar
注意:这似乎与


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

通过
sed
直接添加新行很麻烦。但如果您有
perl
可用,这里有一个选项:

$ foo.txt | perl -pe 's/(.*%%###.*)/\n$1\n/'
在这里,我们捕获每个匹配行,它被定义为任何包含模式
%%####
的行,然后替换为由前导和尾随新行包围的行。

使用GNU-sed:

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

foobar %%## Foo %%### Bar foobar 福巴 %%##福 %%###酒吧 福巴
&
:指匹配的图案空间部分

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

,这可能适合您(GNU sed):

对于符合条件的行,从保留空间中追加一个换行符(默认情况下,保留空间包含一个换行符),然后插入一个空行

另一种方式:

sed -e '/%%###/!b;i\\' -e 'a\\' file
sed '/%%###/{x;p;x;G}' file
这次插入,然后追加空行

注意:
i
a
后面必须跟一个换行符,这可以通过将它们放在单独的
-e
调用中来实现

第三种方式:

sed '/%%###/!b;G;s/.*\(.\)/\1&/' file
与第一种方法一样,从保留空间中附加一个换行符,然后复制它,即修改后的当前行的最后一个字符,并将其前置到当前行

还有另一种方式:

sed -e '/%%###/!b;i\\' -e 'a\\' file
sed '/%%###/{x;p;x;G}' file
交换到保留空间,打印换行符,交换回并追加换行符

注意:如果保持空间可能不是空的(前一个,
x
h
h
g
g
命令可能已经改变了它),则可以使用zap命令
z
在打印前清除缓冲区(
p

当然:

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

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

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

如果您不希望在连续的
%%####
行之间有多个空行,或者如果现有的周围行已为空或您需要执行其他操作,则不希望添加空行,则可以轻松修改上述内容。您是否有只匹配以模式开头的行的版本?如果输入包含两个连续的
%\\\\\\\\\\\\\
行,则将第一个
*
替换为
^
@mariushofer,这两行之间将输出两个空行。这真的是你想要的吗?它还会添加空行,即使周围的行已经是空的。有些事情要考虑……怎么会比不那么麻烦呢?这个答案似乎是合理的。唯一需要注意的是,一些sed不会接受
\n
作为换行符,您需要反斜杠后跟文字换行符,或者依赖shell来扩展
$'\n'
,但是如果您拥有或可以安装perl,那么您就拥有或可以安装接受
\n
的sed。