2

我在 BASH 中有以下字符串,我需要在行尾的电子邮件地址

TAG instance    i-1846f265  AdminEmail  dummy.email@domain.com

据我所知,单词之间的间距始终是单个制表符,末尾的电子邮件地址没有固定长度(可以是任意数量的地址之一)

4

7 回答 7

4

cut -f4应该管用。如果是文件,cut -f4 file. 如果是字符串,cut -f <<<"$string"

于 2013-05-10T13:34:52.260 回答
3

如果它在脚本中,那么这个(只是 bash,没有外部的东西)有效

line='TAG instance    i-1846f265  AdminEmail  dummy.email@domain.com'
set -- $line

echo "email address is " $5

有很多方法可以像这样分割一条线。 cut如前所述awksed

于 2013-05-10T13:40:01.100 回答
2

您可以cut为此目的使用:

$ cut   -f4                -d$'\t'                  your_file
         print 4th field    set tab as delimiter

更短:

$ cut -f4 -d$'\t' your_file

如果它是一个字符串,

$ echo "your_strin" | cut -f4 -d$'\t' your_file
于 2013-05-10T13:34:59.607 回答
0

如果列号不确定,导致 cut 不可靠,您可以对看起来像电子邮件的内容执行正则表达式 grep。

echo "TAG instance    i-1846f265  AdminEmail  dummy.email@domain.com" | grep -o -e "[._a-zA-Z0-9-]\+*@[._a-zA-Z0-9-]\+"
于 2013-05-10T13:41:06.710 回答
0

当我看到“提取”时,我想到了grep

grep -o '\S*$' file
于 2013-05-10T13:41:46.390 回答
0

您可以将字符串读入数组并删除结束前的所有字段:

read -a fields <<< 'TAG instance    i-1846f265  AdminEmail  dummy.email@domain.com'
echo "${fields[@]: -1}"
dummy.email@domain.com

如果标签描述很重要,您可以IFS=$'\t'在阅读前设置以保证标签上的分词。

于 2013-05-10T13:47:32.307 回答
-1

你有没有尝试过:

echo $STRING | awk '{ print $NF }'

或者cut按照上面的建议使用

于 2013-05-10T13:36:27.737 回答