我进行了一些测试,并想到了一个我自己经常使用的测试。
所以我有一些我通常会使用的文件,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/'
会检查该行是否看起来像变量赋值,然后删除=
.假设变量名称只能包含英文字母、数字和下划线。您可能需要对此进行调整。