我经常在bash脚本中使用grep和sed。例如,我使用一个脚本从模板中删除注释
在这个例子中,注释看起来像:
/*# my comments contain text and ascii art:
*#
*# [box1] ------> [box2]o
*#
#*/
我的sed链删除这些行看起来像:
sed '/^/*#/d' | sed '/^s**#/d' | sed '/^s*#*//d'
在编写脚本时,我必须转义和
/
等字符,这会降低代码的可读性。因此,我的问题是:如何在bash脚本中为sed
编写易读的正则表达式
我可以想到的一种方法是使用另一个分隔符而不是/
,就像在vim中一样,您可以本机使用%s#search/text#replace/text#gc
(使用#
作为分隔符),因此允许/
作为未转义字符。定义一个替代转义符也会有所帮助。我对你如何解决这个问题很感兴趣。如果你认为这只是一个sed
问题,我也愿意使用其他工具。
您可以指定不同的分隔符,如下所述。
请注意,Perl也允许您这样做,同时将regexp拆分为几行以提高可读性。
我认为要让regex(很多时候是一系列符号)读起来很好看是很困难的。
然而,你可以做一些事情:
-
使用
-r
(或某些系统中的-E
),这样就不必转义正则表达式运算符()
、{}
、+
、?
-
使用其他分隔符,例如
s
命令sed 's@regex@replacement@' file
对于地址范围(您需要"\")
sed '@pattern@ d' file
-
在地址范围和命令之间留有空格(如上面的
d
)。 -
留下注释,解释regex匹配的内容(您甚至可以包括一个示例)。
3和4更多的是一种间接方法,但它们应该会有所帮助。
不管怎样,你正在做的事情可以用一个sed表达式来完成:
sed ':^/*#:,:^#*/: d' file
除了使用替代分隔符外,您还可以在适当的情况下使用扩展正则表达式,它们会反转转义规则,因此您必须将方括号写为"\[\]"以赋予它们特殊的含义。