我经常在我的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
问题,我也会对替代工具持开放态度。
答案 0 :(得分:4)
您可以指定不同的分隔符as detailed here。
请注意,Perl允许您与splitting your regexp across several lines一起执行此操作,以提高可读性。
答案 1 :(得分:1)
我认为尝试使正则表达式(很多时候是一系列符号)很难阅读,这很难。
但是你可以做一些事情:
在某些系统中使用-r
(或-E
),这样您就不必转义正则表达式运算符()
,{}
,{{1} },+
使用替代分隔符,例如for ?
command
s
对于地址范围(您需要'\')
sed 's@regex@replacement@' file
在地址范围和命令之间留出空格(如上面的sed '\@pattern@ d' file
)。
留下评论解释正则表达式匹配的内容(您甚至可以包含一个示例)。
3和4更多是间接方法,但它们应该有所帮助。
无论如何,你正在做的事情可以在一个sed表达式中完成:
d
答案 2 :(得分:0)
除了使用替代分隔符之外,您可以在适当的地方使用extended regular expressions,它们会反转转义规则,因此您必须将方括号写为“\ [\]”以赋予它们特殊含义。