我在这里的其他类似问题中真的搜索过这类问题,但无法找到答案。
我在文件中有以下文字:
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
但是,我认为此命令中的正则表达式不是通用的。
感谢您的帮助。
答案 0 :(得分:1)
只有当双引号包含您提到的所有字符时,才能使用与相应TYPE
匹配的以下正则表达式。也就是说,至少一个角色,至少是一个数字,至少是一个特殊角色。
grep -oP 'TYPE_[A-Z]\s*=\s*"(?=[^"]*[A-Za-z])(?=[^"]*\d)(?=[^"]*[^"\w])[\W\w]*?"' file
示例:
$ 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