Regex 在bash中检索属性的值

Regex 在bash中检索属性的值,regex,bash,Regex,Bash,我有一个行列表: <some_random_text="someval" my_val_="0.4" some_random_text_1="someval_"> <some_random_text="someval" my_val_="0.8" some_random_text_1="someval_"> <some_random_text="someval" my_val_="1.2" some_random_text_1="someval_">

我有一个行列表:

 <some_random_text="someval" my_val_="0.4" some_random_text_1="someval_">
 <some_random_text="someval" my_val_="0.8" some_random_text_1="someval_">
 <some_random_text="someval" my_val_="1.2" some_random_text_1="someval_">

等等


在每一行中,我想返回在我的值之后给出的数值。如何在bash中执行此操作?

使用
grep

grep -oP 'my_val_="\K[^"]*' filename
-o
以便
grep
仅打印匹配项,
-p
以便使用与Perl兼容的正则表达式


正则表达式中的
\K
将从匹配中删除正则表达式之前的部分匹配的所有内容;这具有查找的效果:仅匹配直接位于
my\u val=“
之后的非引号字符。

grep

grep -oP 'my_val_="\K[^"]*' filename
-o
以便
grep
仅打印匹配项,
-p
以便使用与Perl兼容的正则表达式


正则表达式中的
\K
从匹配中删除所有与它之前的正则表达式部分匹配的内容;这具有向后查找的效果:只匹配直接位于
my\u val=“
之后的非引号字符。

在这个非常严格的结构中,使用sed可以非常轻松地完成以下操作:

sed 's/.*my_val_="\([0-9.]\{1,\}\)".*/\1/' file
或使用扩展正则表达式:

sed -r 's/.*my_val_="([0-9.]+)".*/\1/' file
这将捕获您感兴趣的部分(引号之间的数字和点),并使用它们替换行的内容

正如评论中提到的(谢谢),启用扩展正则表达式的开关在不同版本的sed中有所不同。出于习惯,我倾向于使用
-r
,但有些实现(例如OSX上的BSD)使用
-E
。其他人使用
-r
-E
但是

这也可以在本机bash中完成(尽管我不推荐它……):


在这个非常严格的结构中,使用sed非常容易:

sed 's/.*my_val_="\([0-9.]\{1,\}\)".*/\1/' file
或使用扩展正则表达式:

sed -r 's/.*my_val_="([0-9.]+)".*/\1/' file
这将捕获您感兴趣的部分(引号之间的数字和点),并使用它们替换行的内容

正如评论中提到的(谢谢),启用扩展正则表达式的开关在不同版本的sed中有所不同。出于习惯,我倾向于使用
-r
,但有些实现(例如OSX上的BSD)使用
-E
。其他人使用
-r
-E
但是

这也可以在本机bash中完成(尽管我不推荐它……):


++对于纯bash解决方案!做得好;如果您使用
-E
而不是
-r
,它在Linux和OSX上都可以工作(GNU
sed
也支持
-E
;较新版本的FreeBSD现在也支持
-r
,但是OSX版本,从10.10开始就不支持了;不管怎样,一个警告仍然存在:扩展的正则表达式风格在这些平台上有所不同)@mklement0出于这个确切的原因,我总是有点不愿意在sed中提到ERE(我不敢想象有多少次讨论了实现之间的差异),但你当然是对的。我编辑了我的答案,同时提到了
-E
开关。感谢.++的纯bash解决方案!做得好;如果您使用
-E
而不是
-r
,它在Linux和OSX上都可以工作(GNU
sed
也支持
-E
;较新版本的FreeBSD现在也支持
-r
,但是OSX版本,从10.10开始就不支持了;不管怎样,一个警告仍然存在:扩展的正则表达式风格在这些平台上有所不同)@mklement0出于这个确切的原因,我总是有点不愿意在sed中提到ERE(我不敢想象有多少次讨论了实现之间的差异),但你当然是对的。我编辑了我的答案,同时提到了
-E
开关。谢谢,做得好<代码>-P需要GNU
grep
;如果不可用,请使用
grep-o'my_val=“[^”]*'filename | cut-d\“-f2
。做得很好;
-P
需要GNU
grep
;如果不可用,请使用
grep-o'my_val=“[^”*'filename | cut-d\'-f2