bash中的正则表达式用于“引号”之间的数字

时间:2010-05-28 18:07:57

标签: bash scripting

输入:

hello world "22" bye world

我需要一个可以在bash中运行的正则表达式,它可以获取引号之间的数字。正则表达式应与22匹配。

谢谢!

4 个答案:

答案 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本身并没有真正的正则表达式。但是有一些程序可以使用正则表达式,其中包括grepsed

grep的主要功能是过滤与给定正则表达式匹配的行,即向stdin或文件提供一些数据,然后打印与正则表达式匹配的行。

sed会转换数据。它不仅返回匹配的行,您可以使用s/regex/replacement/命令告诉它返回什么。如果指定\x选项,则输出部分可以包含对组的引用(-r,其中x是组的编号)。

所以我们需要的是sed。您的输入包含一些内容(^.*),",某些数字([0-9]+),"和某些内容(.*$)。我们以后需要引用数字,所以我们需要将数字作为一个组。所以我们完全匹配的正则表达式是:^.*"([0-9]+)".*$。我们希望仅用数字替换它,因此替换部分只是\1

构建完整的sed命令将作为练习:-)

(请注意,sed不会变换不匹配的行。如果您的输入只是上面提供的行,那很好。如果还有其他行要静默跳过,则需要指定选项-n(没有自动打印)并在sed表达式的末尾添加n,指示它打印该行。这样它只打印匹配的行。)