如何使用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有关
更新:我实际上是在寻找仅考虑以模式开头的行的情况。
使用GNU sed:
sed 's/.*%%###.*/\n&\n/' file
输出:
foobar %%## Foo %%### Bar foobar
&
:参考匹配的模式空间部分
如果要“就地”编辑文件,请使用sed的选项-i
。
通过sed
直接添加换行很麻烦。但是如果你有perl
,这里有一个选项:
$ foo.txt | perl -pe 's/(.*%%###.*)/\n$1\n/'
这里我们捕获每个匹配的行,它被定义为任何地方包含模式%%###
的任何行,然后我们用前导和尾随换行包围的那行替换。
这可能适合你(GNU sed):
sed '/%%###/!b;G;i\\' file
对于符合条件的那些行,从保留空间附加换行符(默认情况下保留空间包含换行符)并插入空行。
其他方式:
sed -e '/%%###/!b;i\\' -e 'a\\' file
这次插入然后追加空行。
注: i
和a
必须后跟换行符,这可以通过将它们放在单独的-e
调用中来实现。
第三种方式:
sed '/%%###/!b;G;s/.*\(.\)/\1&/' file
与第一种方式一样,从保持空间附加一个换行符,然后复制它,即修改后的当前行的最后一个字符,并将其添加到当前行。
另一种方式:
sed '/%%###/{x;p;x;G}' file
换到保留空间,打印换行符,换回并附加换行符。
注:如果保持空间可能不为空(前一个,x
,h
,H
,g
或G
命令可能已更改它),则可以使用zap命令p
清除缓冲区(z
)之前清除缓冲区。
而且当然:
sed '/%%###/s/^\|$/\n/g' file
我个人使用字符串而不是正则表达式比较,因为你想要匹配的文本中没有repexp字符,如果你不希望它们被视为这样,只是在字符串周围打印换行而不是修改字符串本身:
awk '{print ($1=="^%%###" ? ORS $0 ORS : $0)}' file
上面的内容适用于每个UNIX盒子上的每个shell中的任何awk,如果你不想在连续的%%###
行之间有多个空白行,或者如果现有的周围行已经空白或者你需要不想要添加空行,则可以很容易地修改做其他事情。