RegExp:试图理解它。进行查询

RegExp:试图理解它。进行查询

我进行了一些测试,并想到了一个我自己经常使用的测试。

所以我有一些我通常会使用的文件,source因为它们在我要做的很多事情中很常见。我试图通过删除成对的“=”之后的所有内容来对其进行模板化Name=Value。这意味着, 在使用 sed 编辑文件后,
Foo=Bar
我将:而不是:
Foo=

我尝试创建一个 RegExp 语句来执行此操作,仅删除之后的值,=但我似乎无法创建一个与单个=而不是多个匹配的值(例如匹配=但不匹配=====

这是我决定发布之前得到的最远信息:s/={1}.*/=/g

有人能提供一些见解吗?我不希望它删除多个,=因为这是我的团队中常用的注释格式,他们使用它们来分割数据输入部分以便于阅读。

一些测试值:--

NameOfServer=Foo   
`#`==========  
`#` UserData   
`#`==========

理想情况下,我希望它匹配第一行中的“=Foo”,但不删除注释行的多个“=”。

注意:我将使用 Sed (v4.2)(如果有任何相关性,也可以在 Vim 中使用 Sed 进行“模式查找和替换”)。

答案1

变量是由一个[a-zA-Z_]字符后跟零个或多个[a-zA-Z_0-9]字符组成的字符串(在 POSIX/C 语言环境中)。

我们可以匹配这些直接跟在 a 后面的字符串=,并删除该行的其余部分:

sed 's/\([a-zA-Z_][a-zA-Z_0-9]*=\).*/\1/' file

在您的示例文件中,这将产生

NameOfServer=
`#`==========
`#` UserData
`#`==========

答案2

={1}.*=.*, 相同,将匹配等号,后跟任意数量的任意字符。正则表达式通常是“贪婪的”,因此它们尝试找到最长的匹配。对等号字符串使用该模式将匹配整个字符串,因为正则表达式引擎无法知道您的意思是字符以外等号。

用于=[^=]*匹配等号后跟除等号之外的任意数量的字符。或者=[^=].*匹配等号,后跟任何其他字符,后跟任何内容。

或者,为了更紧密地匹配行与变量赋值,类似

sed -Ee 's/^([a-zA-Z0-9_]+=).*/\1/'

会检查该行是否看起来像变量赋值,然后删除=.假设变量名称只能包含英文字母、数字和下划线。您可能需要对此进行调整。

相关内容