我能得到一些帮助来匹配下面文本中的字符串吗?
默认用户名和密码为"user"one_answers"ZWiliWH8E2mV"。
我正在尝试获取第二组单引号之间的字符串:ZWiliWH8E2mV。这个字符串是随机生成的,我只能依赖格式,而不能依赖ZWiliWH8E2mV。经过一些谷歌搜索,我可以将其与grep:匹配
cat file_name | grep -oP "(?<=').*?(?=')"
但这是第三场比赛,我不知道该怎么打。如果其他工具更适合我的工作,我愿意使用它们,但我不太熟悉它们。
正如您在问题陈述中所说,您正试图获得第二组单引号之间的字符串,您可以匹配前3个单引号,然后开始匹配,直到出现第四个单引号。
取反字符类[^']+
匹配除单引号之外的任何字符。
^(?:[^']+'){3}K[^']+(?=')
解释
^
字符串开始?:[^']+'){3}'
匹配除'
之外的任何字符3次,然后匹配'K
清除匹配缓冲区(在此之前忘记匹配内容([^']+
匹配1+除'
之外的任何字符(要匹配的内容((?=')
正面前瞻,断言右边的是'
Regex演示| Bash演示
更新后的代码可能看起来像
cat file_name | grep -oP "^(?:[^']+'){3}K[^']+(?=')"
我正在尝试获取第二组单引号之间的字符串
使用awk,可以避免regex:
s="The default username and password is 'user' and 'ZWiliWH8E2mV'."
awk -F "'" '{print $4}' <<< "$s"
ZWiliWH8E2mV
在这里,我们使用'
作为字段分隔符,awk
中的第四个字段将为我们提供用单引号括起来的第二个值。
您可以使用grep
:获取最后两个单引号之间的值
grep -oP ".*'\K[^']+(?=')" file_name
查看在线演示
-o
选项只输出匹配的子字符串,P
使grep
使用PCRE正则表达式引擎。
PCRE正则表达式详细信息
.*
-除换行符之外的任何0个或更多字符,尽可能多'
-一个'
字符K
-匹配重置运算符,丢弃整个匹配内存缓冲区中迄今为止匹配的所有文本[^']+
-除'
字符之外的一个或多个字符(?=')
-一个积极的前瞻性,确保当前位置右侧立即有一个'
字符
如果您有多个单引号字段:
$ s="'first' and 'second' and 'third' and 'fourth' and the rest"
您可以使用以下Perl一行代码来获得nth
字段:
echo "$s" |
perl -lne 'while (/[x27]([^x27]*)[x27]/g) {print $1 if ++$i==3}'
# third
因此,对于您的示例,密码是第二个引用的字段:
echo "The default username and password is 'user' and 'ZWiliWH8E2mV'." |
perl -lne 'while (/[x27]([^x27]*)[x27]/g) {print $1 if ++$i==2}'
打印:
ZWiliWH8E2mV
您也可以使用gawk
和设置为相同regex的FPAT
来打印第n个字段:
s="'first' and 'second' and 'third' and 'fourth' and the rest"
echo "$s" |
gawk -v n=2 'BEGIN{FPAT="[x27][^x27]*[x27]"}
{ gsub(/[x27]/,"",$n); print $n}'
# second
或者,您可以使用两个GNU sed命令的管道,n
是您在第二个sed
:中打印的行
echo "$s" |
gsed -E 's/[^x27]*x27([^x27]*)x27[^x27]*/1n/g' | gsed -nE '4p'
# fourth
注:
CCD_ 29是CCD_ 30的十六进制字符表示。大多数regex实现都支持十六进制字符表示,但并非所有实现都支持。例如POSIXsed
就是不可靠的。