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。