输入:
hello world "22" bye world
我需要一个可以在bash中运行的正则表达式,它可以获取引号之间的数字。正则表达式应与22
匹配。
谢谢!
答案 0 :(得分:3)
嗯,你试过\"([0-9]+)\"
吗?
答案 1 :(得分:1)
在Bash> = 3.2:
while read -r line
do
[[ $line =~ .*\"([0-9]+)\".* ]]
echo "${BASH_REMATCH[1]}"
done < inputfile.txt
使用sed
也是如此,因此它更具可移植性:
while read -r line
do
result=$(sed -n 's/.*\"\([0-9]\+\)\".*/\1/p')
echo "$result"
done < inputfile.txt
答案 2 :(得分:1)
Pure Bash,没有正则表达式。 Number位于数组元素1中。
IFS=\" # input field separator is a double quote now
while read -a line ; do
echo -e "${line[1]}"
done < "$infile"
答案 3 :(得分:0)
bash本身并没有真正的正则表达式。但是有一些程序可以使用正则表达式,其中包括grep
和sed
。
grep的主要功能是过滤与给定正则表达式匹配的行,即向stdin或文件提供一些数据,然后打印与正则表达式匹配的行。
sed会转换数据。它不仅返回匹配的行,您可以使用s/regex/replacement/
命令告诉它返回什么。如果指定\x
选项,则输出部分可以包含对组的引用(-r
,其中x是组的编号)。
所以我们需要的是sed
。您的输入包含一些内容(^.*
),"
,某些数字([0-9]+
),"
和某些内容(.*$
)。我们以后需要引用数字,所以我们需要将数字作为一个组。所以我们完全匹配的正则表达式是:^.*"([0-9]+)".*$
。我们希望仅用数字替换它,因此替换部分只是\1
。
构建完整的sed命令将作为练习:-)
(请注意,sed不会变换不匹配的行。如果您的输入只是上面提供的行,那很好。如果还有其他行要静默跳过,则需要指定选项-n
(没有自动打印)并在sed表达式的末尾添加n
,指示它打印该行。这样它只打印匹配的行。)