如何在bash中使用正则表达式来选择双引号之间的字符串?

时间:2014-12-30 06:51:37

标签: regex linux bash

我在这里的其他类似问题中真的搜索过这类问题,但无法找到答案。

我在文件中有以下文字:

TYPE_A = "1" AND TYPE_B = "6" AND TYPE_C = "8755asd-"

我正在尝试grep以下(双引号可以包括数字,字符和特殊字符):

TYPE_C = "8755asd-"

我使用的grep命令是:grep -o "TYPE_C = \"[0-9a-zA-Z-]*\"" text.txt

但是,我认为此命令中的正则表达式不是通用的。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

只有当双引号包含您提到的所有字符时,才能使用与相应TYPE匹配的以下正则表达式。也就是说,至少一个角色,至少是一个数字,至少是一个特殊角色。

grep -oP 'TYPE_[A-Z]\s*=\s*"(?=[^"]*[A-Za-z])(?=[^"]*\d)(?=[^"]*[^"\w])[\W\w]*?"' file

DEMO

示例:

$ cat ri
TYPE_A = "1" AND TYPE_B = "6" AND TYPE_C = "8755asd-"
TYPE_A = "1" AND TYPE_B = "6" AND TYPE_C = "875d"
TYPE_A = "1" AND TYPE_B = "6" AND TYPE_C = "asd-"
TYPE_A = "1" AND TYPE_B = "6" AND TYPE_C = "875-"
$ grep -oP 'TYPE_[A-Z]\s*=\s*"(?=[^"]*[A-Za-z])(?=[^"]*\d)(?=[^"]*[^"\w])[\W\w]*?"' ri
TYPE_C = "8755asd-"

答案 1 :(得分:1)

我用sed

来做
sed -n 's@.* TYPE_C = "\([0-9a-zA-Z-]*\)".*@\1@p' text.txt

也就是说,-n不能打印不匹配的行。然后在TYPE_C之后用双引号替换整行,并用p打印结果:

8755asd-

答案 2 :(得分:0)

如果图案保持不变,您可以使用剪切来获得相同的输出。

echo 'TYPE_A = "1" AND TYPE_B = "6" AND TYPE_C = "8755asd-"' | cut -d"\"" -f6