我有几个像这样的字符串:
var1="string one=3423423 and something which i don't care"
var2="another bigger string=413145 and something which i don't care"
var3="the longest string ever=23442 and something which i don't care"
这些字符串是python脚本的输出(我不允许触摸),我需要一种方法来提取字符串的第一部分,就在数字之后。基本上,我的输出应该是:
"string one=3423423"
"another bigger string=413145"
"the longest string ever=23442"
如您所见,我不能使用位置或类似的东西,因为数字和字符串长度并不总是相同。我假设我需要使用正则表达式或其他东西,但我真的不了解正则表达式。你能帮忙做一个命令或能做到这一点的事吗?
答案 0 :(得分:1)
grep -oP '^.*?=\d+' inputfile
string one=3423423
another bigger string=413145
the longest string ever=23442
此处-o
标记将grep
仅打印匹配的部分,而-p
将perl
启用grep
正则表达式\d+
。这里^.*?=\d+
表示一个或多个数字。因此,var1="string one=3423423 and something which i don't care"
name=${var1%%=*}
value=${var1#*=}
value=${value%%[^0-9]*}
echo "$name=$value"
# prints: string one=3423423
表示从行的开头打印,直到找到最后一个数字(第一个匹配)。
答案 1 :(得分:0)
您可以使用参数扩展,例如:
${var1%%=*}
%%
的解释:
=
- 删除最长的匹配后缀=
- 匹配*
${var1#*=}
- 匹配所有内容 #
的解释:
*
- 删除最短的匹配前缀=
- 匹配所有内容=
- 匹配${value%%[^0-9]*}
%%
的解释:
[^0-9]
- 删除最长的匹配后缀*
- 匹配任何非数字extract_and_print() {
local input=$1
local name=${input%%=*}
local value=${input#*=}
value=${value%%[^0-9]*}
echo "$name=$value"
}
extract_and_print "$var1"
extract_and_print "$var2"
extract_and_print "$var3"
- 匹配所有内容要轻松地对多个值执行相同的操作, 你可以把这个逻辑包装成一个函数:
2017-01-01T12:12:41Z "GET /api/posts" HTTP/1.1 200 "-"
2017-01-01T12:12:42Z "GET /api/posts/56/comments" HTTP/1.1 200 "-"
2017-01-01T12:12:42Z "GET /api/posts" HTTP/1.1 200 "-"
2017-01-01T12:12:56Z "POST /api/posts" HTTP/1.1 202 "Safari"
2017-01-01T12:12:58Z "GET /api/posts/134/comments" HTTP/1.1 200 "-"
答案 2 :(得分:0)
$ shopt -s extglob
$ echo "${var1%%+([^0-9])}"
string one=3423423
$ echo "${var2%%+([^0-9])}"
another bigger string=413145
$ echo "${var3%%+([^0-9])}"
the longest string ever=23442
+([^0-9])
是一个与一个或多个非数字匹配的扩展模式
带${var%%+([^0-9])}
的{{1}}将从变量值的末尾删除该模式的最长匹配。