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