如何解决如何用awk在等号后的引号中提取数字
我的参数中有这样的东西:
config_version = "1.2.3"
我正在尝试使用 awk 命令获得不带引号的 1.2.3,这可能吗?
我如何获得报价: awk '/config_version =/ {print $3}' params.txt 输出:“1.2.3”
期望:1.2.3
解决方法
找到带有正确标签的行,修剪值的引号并打印。
$ awk '$1=="config_version"{gsub(/"/,"",$NF); print $NF}' file
,
我会使用 gsub
删除前导和尾随 "
:
$ awk '{gsub(/^"|"$/,$3);print $3}'
,
强制性(或者,可能是“其中之一”,而不是“该”。有很多方法可以做到这一点!)sed 解决方案:
sed -n '/^config_version *= */{y/"/ /; s///p;}'
请注意,这会在结果中留下一个尾随空格。
,使用grep
:
echo 'config_version = "1.2.3"' | grep -Po 'config_version\s+=\s+"\K[^"]+'
1.2.3
此处,GNU grep
使用以下选项:-P
:使用 Perl 正则表达式。-o
:仅打印匹配项(每行 1 个匹配项),而不是整行。
\K
:使正则表达式引擎“保留”它在 \K
之前匹配的所有内容,而不将其包含在匹配中。具体来说,在打印匹配时忽略正则表达式的前面部分。
另见:grep
manual
perlre - Perl regular expressions
您可以设置 FS
,因此 "
将被视为字段分隔符的一部分,让 file.txt
内容为:
config_version = "1.2.3"
然后
awk 'BEGIN{FS="[ \"]+"}/config_version =/{print $3}'
输出
1.2.3
说明:我指示 AWK 将任何由空格或 "
或它们的组合组成的非空字符串视为字段分隔符。如果您想了解有关 FS
和其他人的更多信息,我建议您阅读 8 Powerful Awk Built-in Variables – FS,OFS,RS,ORS,NR,NF,FILENAME,FNR。
(在 gawk 4.2.1 中测试)
,使用 gnu awk,您还可以使用带有捕获组的模式并使用 m[1]
打印组 1 值
awk 'match($0,/config_version = "([^"]+)"/,m) {print m[1]}' file
如果应该有可选的数字后跟一个点和数字:
awk 'match($0,/config_version = "([0-9]+(\.[0-9]+)*)"/,m) {print m[1]}' file
输出
1.2.3
,
还有awk
:
$ echo 'config_version = "1.2.3"' | awk -F'=' '{gsub(/"/,$2);print $2}'
1.2.3
,
有3种方法可以做到。干净的方式如 (\042
八进制是双引号 "
)
{mawk 1/2 | gawk} 'BEGIN { FS = "\042" } $1 ~ /config_version =$/ {print $2}'
如果数据格式错误,我会指定 $1 ~
以确保它是在版本号之后显示的短语。另一个更极端的版本要求 FS 完成所有工作
{mawk 1/2 | gawk} 'BEGIN { FS = "(^[ \t]*config_version =\042|\042.*$)"
} NF==3 {print $2}'
在这里,我让 FS 从左到右吞噬了记录的其余部分,因此 NF==3 提供强制执行,只有这种情况才会出现。最后,一种纯粹的方法
{mawk 1/2 | gawk} 'BEGIN { FS = "(^[ \t]*config_version =\042|\042.*$)" ;
OFS = "" ;} ( NF == 3 ) && ( $1 = $1 )'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。