我有一个包含多行格式的文件:
bc("STG1/Phone") = {type=bana_pub; cbb=12.354; abb=0.0}`
我正在寻找提取cbb=12.354;
。目前,我正在执行以下操作:
cat input_file.txt | grep cbb | awk -F " " '{ print $4 }'`
问题是我的方法是地点具体来说,即假设它始终是第 4 个字段。我如何提取表格中的文本,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}
我的直觉告诉我正则表达式可能是可行的方法,但如果可以的话,我通常会尝试避免它,因为我更喜欢简单的匹配工具(我更了解它)。
非常感谢您的帮助。
答案1
解决方案:
grep -Eo 'cbb=[^;}]+'
我们来测试一下:
$ grep -Eo 'cbb=[^;}]+' <<<'bc("STG1/Phone") = {type=bana_pub; cbb=12.354; abb=0.0}`'
$ cbb=12.354
解释:
使用时,... | grep cbb | ...
您使用的是基本正则表达式。高级正则表达式并不那么复杂。
该选项-E
用于高级正则表达式,对于不转义某些元字符很有用。-o
用于打印 grep 匹配的内容而不是整行。
正则表达式cbb=[^;}]+
对于任何其他 cmd 都是相同的,而不仅仅是 grep。
cbb=
是一个固定字符串,其中没有元字符(c
后跟b
等)
[^;}]+
方括号在单个位置上界定字符集。开头的插入符号表示否定字符集。加号表示一个或多个字符。这样它将匹配任何字符,至少一个,直到找到一个;
或}
这是一个了解有关正则表达式的更多信息的良好链接: https://www.regular-expressions.info/characters.html
答案2
这是可行的并且与位置无关:
grep cbb input_file.txt | awk -F "cbb=" '{ print $2 }'| awk -F ";" '{print "cbb=" $1}'
首先,它仅选择包含的行cbb
,然后使用字符串cbb=
作为分隔符,最后使用;
添加字符串作为字段分隔符cbb=到最终的结果。
答案3
您也可以使用 sed(因为 sed 只被调用一次,所以应该更快)
sed -n 's/^.*\(cbb=[0-9\.]*\).*$/\1/p' sample.txt
其中,sample.txt 是您的输入文件。仅检查数字 ([0-9.]) 以解决可选分号可能存在的问题。
答案4
在这种情况下,grep
这是完成这项工作的正确工具。不过,我想补充一点:
Perl
perl -lane 'print $1 if /(cbb=[^;}]+)/' input_file.txt
大王
awk 'match($0,/cbb=[^;}]+/,m) {print m[0]}' input_file.txt
塞德
sed -rn 's/.*(cbb=[^;}]+).*/\1/p' input_file.txt
感谢 Paulo 理解了 OP 的意思:
后面
=
可以是任意长度,分号;
是可选的。我唯一能保证的是,该术语cbb=12.354;
将被空格包围