Linux 从文件中提取匹配的文本字段

fsw*_*ngs 2 linux awk sed command-line

我有一个文件,其中包含许多行格式:

bc("STG1/Phone") = {type=bana_pub; cbb=12.354; abb=0.0}`
Run Code Online (Sandbox Code Playgroud)

我正在寻找提取cbb=12.354;. 目前,我正在执行以下操作:

cat input_file.txt | grep cbb | awk -F " " '{ print $4 }'`
Run Code Online (Sandbox Code Playgroud)

问题是我的方法是特定于位置的,即假设它始终是第四个字段。cbb=在知道=它可以是任意长度并且分号是可选的之后,如何提取表单的文本;。我唯一的保证是,cbb=12.354;如果有帮助的话,该术语将被空格包围。将来的文件可能是以下格式:

bc("STG1/Phone") = {type=bana_pub; cbb=12.354; abb=0.0}
bc("STG1/Phone") = {type=bana_pub;  abb=0.0; cbb=12.354}
Run Code Online (Sandbox Code Playgroud)

我的直觉告诉我,正则表达式可能是正确的选择,但如果可以的话,我通常会尽量避免使用它,因为我更喜欢简单的匹配工具(我对此了解得更好)。

感谢您的帮助。

Pau*_*ulo 5

解决方案:

grep -Eo 'cbb=[^;}]+'
Run Code Online (Sandbox Code Playgroud)

我们来测试一下:

$ grep -Eo 'cbb=[^;}]+' <<<'bc("STG1/Phone") = {type=bana_pub; cbb=12.354; abb=0.0}`'
$ cbb=12.354
Run Code Online (Sandbox Code Playgroud)

解释:

当您使用时,... | grep cbb | ...您正在使用基本的正则表达式。高级正则表达式并不那么复杂。

选项-E用于高级正则表达式,对于不转义某些元字符很有用。-o用于打印 grep 匹配的内容而不是整行。

正则表达式cbb=[^;}]+对于任何其他 cmd 都是相同的,而不仅仅是 grep。

cbb=是一个固定字符串,没有元字符(c后面跟着b等)

[^;}]+方括号在单个位置界定字符集。开头的插入符号表示否定字符集。加号表示一个或多个字符。这样它将匹配任何字符,至少一个,直到找到一个;}

这是一个很好的链接,可以了解有关正则表达式的更多信息: https ://www.regular-expressions.info/characters.html