关于regex:在shell脚本中搜索字符串中的子字符串

Searching for a substring in a string in shell script

本问题已经有最佳答案,请猛点这里访问。

我有一根很长的绳子(长度也不固定)我想提取"email"和"@gmail.com"之间的子字符串

假设是

1
xhxjcndjcnkjcnd cjkjcdckjncx email:[email protected] djc

我想提取字符串中的"子字符串"。我可以使用正则表达式和sed工具来完成这项工作吗?


1
perl -lne 'print $1 if(/email:(.*?)\@gmail.com/)'

下面的测试:

1
2
3
> echo"xhxjcndjcnkjcnd cjkjcdckjncx email:[email protected] djc" | perl -lne 'print $1 if(/email:(.*?)\@gmail.com/)'
substring
>

壳可以处理这个:

1
2
3
4
5
$ line='xhxjcndjcnkjcnd cjkjcdckjncx email:[email protected] djc'
$ name=${line#*email:}       # remove the prefix ending with"email:"
$ name=${name%@gmail.com*}   # remove the suffix starting with"@gmail.com"
$ echo $name
substring


另一个awk

1
2
awk -F":" '{split($2,a,"@");print a[1]}' file
substring

你有很多的网络搜索公司两个Gmail地址

1
2
awk -F":" '/gmail\.com/ {split($2,a,"@");print a[1]}'
substring

利用sed

1
2
3
INPUT="xhxjcndjcnkjcnd cjkjcdckjncx email:[email protected] djc"
USERNAME=$(sed -n"s/.*\email:\(.*\)@gmail\.com.*/\\1/p" <<< $INPUT)
echo $USERNAME


VALUE="xhxjcndjcnkjcnd cjkjcdckjncx email:[email protected] djc"

echo $VALUE | awk -F":" '{print $2}' |cut -d@ -f1


我认为grep(正面和积极的预测和追溯)是正确的工具的工作:

1
2
$ grep -oP '(?<=email:).*?(?=@gmail\.com)'<<<"xhxjcndjcnkjcnd cjkjcdckjncx email:[email protected] djc"
substring