【发布时间】:2021-05-01 10:56:43
【问题描述】:
我有一个字符串 "12G 39G 24% /dev" 。我必须提取值'24'。我使用了下面的正则表达式
grep '[0-9][0-9]%' -o
但我得到的输出是 24%。我只想要 24 作为输出并且不想要 '%' 字符。如何修改正则表达式脚本以仅提取 24 作为值?
【问题讨论】:
我有一个字符串 "12G 39G 24% /dev" 。我必须提取值'24'。我使用了下面的正则表达式
grep '[0-9][0-9]%' -o
但我得到的输出是 24%。我只想要 24 作为输出并且不想要 '%' 字符。如何修改正则表达式脚本以仅提取 24 作为值?
【问题讨论】:
一种选择是再次使用grep 获取数字:
grep -o '[0-9][0-9]%' | grep -o '[0-9][0-9]'
但是,如果您想使用单个正则表达式来完成此操作,您可以使用以下内容:
grep -Po '[0-9]{2}(?=%)'
在这种情况下请注意-P 选项; vanilla grep 似乎不支持 (?=%) “环视”部分。
【讨论】:
不捕获某些内容的最常见方法是使用look-around assertions: 像这样使用它
grep -oP '[0-9][0-9](?=%)'
值得注意的是,GNU grep 支持-P 选项以启用与 Perl 兼容的正则表达式语法,但它不包含在 OS X 中。在 Linux 上,它将默认可用。一种解决方法是改用ack。
但我仍然建议在 OS X 上默认使用 GNU grep。它可以使用 Homebrew 安装在 OSX 上,命令为 brew grep install
【讨论】:
您可以使用 sed 作为替代方案:
sed -rn 's/(^.*)([[:digit:]]{2})(%.*$)/\2/p' <<< "12G 39G 24% /dev"
使用 -r 或 -E 启用正则表达式,然后将行拆分为用括号表示的 3 个部分。仅替换第二部分的行并打印。
【讨论】:
使用awk:
awk '{print $3+0}'
您要查找的值在第三个字段中,添加零会将字符串强制转换为数字,因此删除了%。
【讨论】: