Regex:在两个单引号之间抓取第二个字符串



我能得到一些帮助来匹配下面文本中的字符串吗?


默认用户名和密码为"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就是不可靠的。

最新更新