我有一个非常大的正则表达式模式字符串,用于从日志文件中删除 INFO 消息。当我像下面这样在一行中使用它时,它可以正常工作:
sed -r '/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]) [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3} INFO)/d' >> $2
但是正如您所见,这很难阅读,因此我尝试将其放入变量中并将其分成多行。所以我做了以下事情:
regex='/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01])
[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3} INFO)/d'
cat copy.out | sed -r $regex >> tmp_log.txt
但我不断收到来自 sed 的错误:
sed: -e expression #1, char 67: unterminated address regex
当我使用 echo 时,打印正则表达式字符串时没有任何换行符。
echo $regex
/([12][[:digit:]]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][[:digit:]]|3[01]) [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3} INFO)/d
看来我在这里遗漏了一些非常基本的东西,我做错了什么?
通过在表达式字符串周围使用双引号
sed
,您可以使用普通的续行将其分成多行:\
第一行的末尾必须有一个换行符,第二行不能以任何多余的字符开头。我将字符串中的空格移到第一行,使其看起来是故意的,而不是意外的缩进。或者,您可以使用两个单引号字符串的连接:
这将为变量分配一个单行字符串
expression
。然后,您将其用作
在这里,我在这里使用as来
-E
代替更普遍支持的 as(用于在 中启用扩展的正则表达式),并使用来告诉下一个参数是应用于输入的表达式。表达式本身需要双引号,因为我们不希望 shell 对其值执行分词和文件名通配符。-r
-E
sed
-e
sed
sed
sed