1

我经常在我的 bash 脚本中使用 grep 和 sed。例如,我使用脚本从模板中删除注释

在此示例中,注释如下所示:

/*#  my comments contain text and ascii art:
 *#
 *#  [box1] ------> [box2]o
 *#
#*/

我删除这些行的 sed 链如下所示:

sed '/^\/\*#/d' | sed '/^\s*\*#/d' | sed '/^\s*#\*\//d'

在我的脚本中,我必须转义诸如\and之类的字符/,这会降低代码的可读性。因此,我的问题是:如何sed在 bash 脚本中编写易于阅读的正则表达式?

我能想到的一种方法是使用另一个分隔符而不是/,就像在 vim 中您可以本机使用%s#search/text#replace/text#gc(使用#as 分隔符)并因此允许/作为未转义字符一样。定义一个替代的转义字符也会有所帮助。我会对你如何解决这个问题感兴趣。sed如果您认为这只是一个问题,我也愿意接受替代工具。

4

3 回答 3

4

您可以指定不同的分隔符,详见此处

请注意,Perl 也允许您这样做,同时将您的正则表达式拆分为多行以提高可读性。

于 2012-10-29T09:12:59.210 回答
1

我认为尝试使正则表达式(很多时候是一系列符号)易于阅读是非常困难的。

但是,您可以做一些事情:

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

  2. 使用替代分隔符,例如用于s命令

    sed 's@regex@replacement@' file
    

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

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

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

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

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

sed '\:^/\*#:,\:^#\*/: d' file
于 2012-10-29T10:26:23.490 回答
0

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

于 2012-10-29T09:18:14.570 回答