【问题标题】:Searching for a substring in a string in shell script [duplicate]在shell脚本中搜索字符串中的子字符串[重复]
【发布时间】:2013-09-25 17:19:37
【问题描述】:

我有一个很长的字符串(长度也不固定) 我想提取位于“电子邮件”和“@gmail.com”之间的子字符串

假设是

xhxjcndjcnkjcnd cjkjcdckjncx email:substring@gmail.comjndhcjkdhcnchjdccb djc

我想提取字符串中的“子字符串”.. 我可以使用正则表达式,使用 sed 工具来做到这一点吗?

【问题讨论】:

  • 除了gmail还有其他邮件吗?如果是这样,使用 gmail 作为搜索的解决方案将不起作用。

标签: regex string shell sed


【解决方案1】:
perl -lne 'print $1 if(/email:(.*?)\@gmail.com/)'

测试如下:

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

【讨论】:

    【解决方案2】:

    VALUE="xhxjcndjcnkjcnd cjkjcdckjncx 电子邮件:substring@gmail.comjndhcjkdhcnchjdccb djc"

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

    【讨论】:

    • sedawk 做同样的事情,那么为什么不是两个awk 这样的awk -F: '{print $2}' | awk -F@ '{print $1}' 或两个sed
    【解决方案3】:

    使用sed:

    INPUT="xhxjcndjcnkjcnd cjkjcdckjncx email:substring@gmail.comjndhcjkdhcnchjdccb djc"
    USERNAME=$(sed -n "s/.*\email:\(.*\)@gmail\.com.*/\\1/p" <<< $INPUT)
    echo $USERNAME
    

    【讨论】:

    • 这返回 substring@gmail.com 不正确 substring。您还应该将 backtics 更改为 paranthese $(data) Eksample MAIL=$(sed -n "s/.*\email:\(.*@gmail\.com\).*/\\1/p" &lt;&lt;&lt; $INPUT)
    【解决方案4】:

    另一个awk

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

    如果您有很多行要搜索 gmail 地址

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

    【讨论】:

      【解决方案5】:

      我认为 grep(积极的前瞻和积极的后瞻)是完成这项工作的正确工具:

      $ grep -oP '(?<=email:).*?(?=@gmail\.com)'<<< "xhxjcndjcnkjcnd cjkjcdckjncx email:substring@gmail.comjndhcjkdhcnchjdccb djc"
      substring
      

      【讨论】:

        【解决方案6】:

        shell 可以处理这个:

        $ line='xhxjcndjcnkjcnd cjkjcdckjncx email:substring@gmail.comjndhcjkdhcnchjdccb djc'
        $ name=${line#*email:}       # remove the prefix ending with "email:"
        $ name=${name%@gmail.com*}   # remove the suffix starting with "@gmail.com"
        $ echo $name
        substring
        

        【讨论】:

          猜你喜欢
          • 2015-12-21
          • 2011-01-20
          • 1970-01-01
          • 2018-12-01
          • 2019-09-03
          • 2019-10-06
          • 1970-01-01
          • 2013-06-10
          相关资源
          最近更新 更多