我正在尝试编写一个正则表达式,用于匹配和排除文件中包含${
后跟}
且文件之间或周围包含任何字符的所有字符串。中间可以是任何字符/数字/下划线/破折号/等(里面没有括号)。
匹配示例:
hello ${VAR}
${HELLO_VAR} world
https://${WEB_VAR}
我想出了这个:egrep -v '^\${[a-zA-Z?]'
,尽管它似乎部分起作用,但我不确定它是否正确。我该怎么办?
输入文件中的字符串由换行符分隔,非常类似于简单的Java属性。
答案 0 :(得分:3)
您可以尝试使用sed命令。
sed 's/\$\{[^}]*\}//g' <input_file> > <output_file>
此处的sed排除'{'和'}'之间的所有字符,并将新内容写入新的输出文件中。
答案 1 :(得分:2)
您可以尝试一下:
\$\{[^}]*\}
按字面上匹配${
,然后匹配除}
之外的所有内容,然后匹配}
答案 2 :(得分:2)
您说您要尝试排除文件中的所有字符串,所以听起来您需要的东西比仅带grep
的正则表达式还要高级。我会使用awk脚本来做到这一点:
awk '{while(match($0,/\$\{[^}]*\}/)){$0=substr($0,0,RSTART-1) substr($0,RSTART+RLENGTH)}} 1' input.txt
或者,拆分以便于阅读和评论
{
while (match($0,/\$\{[^}]*\}/)) {
$0=substr($0,0,RSTART-1) substr($0,RSTART+RLENGTH)
}
}
1
这里的想法是,对于每一行,我们将检查正则表达式是否匹配该行上的任何内容。如果是这样,我们将用匹配的正则表达式的 around 部分替换该行。 (我们可以替换sub(/RE/,"")
,但这需要在每场比赛中两次而不是一次应用正则表达式。)
最后的1
是表示“打印当前行”的简写。无论循环是否处理了任何匹配项,它都会运行。
答案 3 :(得分:0)
只需在两个序列之间使用全局通配符.*
,如下所示:
.*\$\{.*\}.*
由于要匹配整行,因此必须在两边都使用通配符,以将正则表达式扩展到两端(用^
和$
锚定它并不重要(贪婪算法将尝试尽可能地扩展)。请注意,$
,{
和}
必须转义,因为它们是正则表达式语言保留的。
这可以在动作here中看到。
此问题的标题未指定两个花括号之间的子字符串不应包含}
,并且由于您只想匹配整行,因此无需检查任何内容除了}
以外,唯一的要求是}
必须在行中${
之后。无论如何,这在效率上没有缺点,因为解析此正则表达式的NFA具有与其他正则表达式相同的状态数。