用于字符串匹配的正则表达式**** $ {****} ***

时间:2018-08-31 05:46:00

标签: regex bash

我正在尝试编写一个正则表达式,用于匹配和排除文件中包含${后跟}且文件之间或周围包含任何字符的所有字符串。中间可以是任何字符/数字/下划线/破折号/等(里面没有括号)。

匹配示例:

hello ${VAR}
${HELLO_VAR} world
https://${WEB_VAR}

我想出了这个:egrep -v '^\${[a-zA-Z?]',尽管它似乎部分起作用,但我不确定它是否正确。我该怎么办?

输入文件中的字符串由换行符分隔,非常类似于简单的Java属性。

4 个答案:

答案 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具有与其他正则表达式相同的状态数。