Regex 使正则表达式在shell脚本中看起来更漂亮

Regex 使正则表达式在shell脚本中看起来更漂亮,regex,bash,sed,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脚本中使用grep和sed。 例如,我使用脚本从模板中删除注释

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

/*#  my comments contain text and ascii art:
 *#
 *#  [box1] ------> [box2]o
 *#
#*/
用于删除这些行的sed链如下所示:

sed '/^\/\*#/d' | sed '/^\s*\*#/d' | sed '/^\s*#\*\//d'
我在脚本中必须转义字符,如\和/,这会降低代码的可读性。因此,我的问题是:如何在bash脚本中为sed编写易于阅读的正则表达式


我可以想到的一种方法是使用另一个分隔符而不是/,就像在vim中一样,在vim中,您可以使用as分隔符本机使用%s搜索/textplace/textgc,因此允许/作为未替换字符。定义另一个转义字符也会有所帮助。我想知道你是如何解决这个问题的。如果您认为这只是sed问题,我也愿意使用其他工具。

您可以指定不同的分隔符


请注意,Perl也允许您这样做,同时为了更好的可读性。

您可以指定不同的分隔符


请注意,Perl也允许您这样做,同时为了更好的可读性。

除了在适当的情况下使用可选的分隔符外,它们还反转转义规则,因此您必须将方括号写为\[\]给它们特殊的含义。

除了在适当的情况下使用可选的分隔符外,它们还颠倒了转义规则,因此你必须将方括号写为\[\],以赋予它们特殊的含义。

我认为,试图使经常是符号序列的正则表达式易于阅读是相当困难的

但是,您可以做以下几件事:

在某些系统中使用-r或-E,这样就不必转义正则表达式操作符,{},+

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

对于地址范围,您需要“\”

sed '\@pattern@ d' file
在地址范围和命令之间留出空格,如上面的d所示

留下注释解释正则表达式匹配的内容,甚至可以包括一个示例

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

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

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

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

但是,您可以做以下几件事:

在某些系统中使用-r或-E,这样就不必转义正则表达式操作符,{},+

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

对于地址范围,您需要“\”

sed '\@pattern@ d' file
在地址范围和命令之间留出空格,如上面的d所示

留下注释解释正则表达式匹配的内容,甚至可以包括一个示例

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

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

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

我想大多数人都会同意,一大堆跳舞的牙签根本不可读all@BrianAgnew-我已经删除了我回答中有争议的部分。我想大多数人都会同意,一大堆跳舞的牙签根本不可读all@BrianAgnew-我已删除我的回答中有争议的部分。我喜欢它这么简单。我认为解决方案会更复杂-谢谢。我喜欢它这么简单。我认为解决方案会更复杂-谢谢你的回答。它们有助于使正则表达式更干净。此外,我还编写了一些子模式作为变量和函数,这也使得代码的可读性更好。这是当前的完整版本。谢谢你的回答。它们有助于使正则表达式更干净。此外,我还编写了一些子模式作为变量和函数,这也使得代码的可读性更好。这是当前的完整版本。