sed 或 grep 在一组括号之间读取
sed or grep to read between a set of parentheses
我正在尝试从某些命令的输出中读取一组括号之间的版本号:
Test Application version 1.3.5
card 0: A version 0x1010000 (1.0.0), 20 ch
Total known cards: 1
我想要的是 1.0.0。
我试过 sed 和 grep 的变体:
command.sh | grep -o -P '(?<="(").*(?=")")'
command.sh | sed -e 's/(\(.*\))//'
还有很多变化。运气不好:-(
帮忙?
你快到了!在 pgrep 中,使用反斜杠来保留括号的字面意思,而不是双引号:
grep -o -P '(?<=\().*(?=\))'
有了 GNU grep,您还可以使用 perl 模式下可用的 \K
转义序列:
grep -oP '\(\K[^)]+'
\K
删除到目前为止匹配的内容。在这种情况下,开始的 (
将从比赛中移除。
或者您可以使用 awk
:
awk -F'[()]' 'NF>1{print }'
该命令使用括号作为分隔符来拆分输入行。一旦一行被分成多个字段(意味着找到括号)版本号是第二个字段并被打印。
顺便说一句,您显示的 sed
命令应该是:
sed -ne 's/.*(\(.*\)).*//p'
有几个变体可以使用。首先用 grep
和 sed
:
grep '(' filename | sed 's/^.*[(]\(.*\)[)].*$//'
或使用简短的 shell 脚本:
#!/bin/sh
while read -r line; do
value=$(expr "$line" : ".*(\(.*\)).*")
if [ "x$value" != "x" ]; then
printf "%s\n" "$value"
fi
done <""
您给定的输入文件 return 1.0.0
。
我正在尝试从某些命令的输出中读取一组括号之间的版本号:
Test Application version 1.3.5
card 0: A version 0x1010000 (1.0.0), 20 ch
Total known cards: 1
我想要的是 1.0.0。 我试过 sed 和 grep 的变体:
command.sh | grep -o -P '(?<="(").*(?=")")'
command.sh | sed -e 's/(\(.*\))//'
还有很多变化。运气不好:-(
帮忙?
你快到了!在 pgrep 中,使用反斜杠来保留括号的字面意思,而不是双引号:
grep -o -P '(?<=\().*(?=\))'
有了 GNU grep,您还可以使用 perl 模式下可用的 \K
转义序列:
grep -oP '\(\K[^)]+'
\K
删除到目前为止匹配的内容。在这种情况下,开始的 (
将从比赛中移除。
或者您可以使用 awk
:
awk -F'[()]' 'NF>1{print }'
该命令使用括号作为分隔符来拆分输入行。一旦一行被分成多个字段(意味着找到括号)版本号是第二个字段并被打印。
顺便说一句,您显示的 sed
命令应该是:
sed -ne 's/.*(\(.*\)).*//p'
有几个变体可以使用。首先用 grep
和 sed
:
grep '(' filename | sed 's/^.*[(]\(.*\)[)].*$//'
或使用简短的 shell 脚本:
#!/bin/sh
while read -r line; do
value=$(expr "$line" : ".*(\(.*\)).*")
if [ "x$value" != "x" ]; then
printf "%s\n" "$value"
fi
done <""
您给定的输入文件 return 1.0.0
。