使正则表达式在shell脚本中看起来很好看



我经常在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(很多时候是一系列符号)读起来很好看是很困难的。

然而,你可以做一些事情:

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

  2. 使用其他分隔符,例如s命令

    sed 's@regex@replacement@' file
    

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

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

  4. 留下注释,解释regex匹配的内容(您甚至可以包括一个示例)。

3和4更多的是一种间接方法,但它们应该会有所帮助。

不管怎样,你正在做的事情可以用一个sed表达式来完成:

sed ':^/*#:,:^#*/: d' file

除了使用替代分隔符外,您还可以在适当的情况下使用扩展正则表达式,它们会反转转义规则,因此您必须将方括号写为"\[\]"以赋予它们特殊的含义。

相关内容

  • 没有找到相关文章

最新更新