使正则表达式在shell脚本中看起来不错

时间:2012-10-29 09:10:17

标签: regex bash sed

我经常在我的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问题,我也会对替代工具持开放态度。

3 个答案:

答案 0 :(得分:4)

您可以指定不同的分隔符as detailed here

请注意,Perl允许您与splitting your regexp across several lines一起执行此操作,以提高可读性。

答案 1 :(得分:1)

我认为尝试使正则表达式(很多时候是一系列符号)很难阅读,这很难。

但是你可以做一些事情:

  1. 在某些系统中使用-r(或-E),这样您就不必转义正则表达式运算符(){},{{1} },+

  2. 使用替代分隔符,例如for ? command

    s

    对于地址范围(您需要'\')

    sed 's@regex@replacement@' file
    
  3. 在地址范围和命令之间留出空格(如上面的sed '\@pattern@ d' file )。

  4. 留下评论解释正则表达式匹配的内容(您甚至可以包含一个示例)。

  5. 3和4更多是间接方法,但它们应该有所帮助。

    无论如何,你正在做的事情可以在一个sed表达式中完成:

    d

答案 2 :(得分:0)

除了使用替代分隔符之外,您可以在适当的地方使用extended regular expressions,它们会反转转义规则,因此您必须将方括号写为“\ [\]”以赋予它们特殊含义。