用bash提取一段字符串?

时间:2013-05-10 13:31:46

标签: regex bash cut

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

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

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

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

echo "email address is " $5

有很多方法可以像这样划分一条线。如上所述cutawksed

答案 2 :(得分: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

答案 3 :(得分:0)

如果列号不确定,使切割不可靠,您可以对看起来像电子邮件的内容执行regexp grep。

echo "TAG instance    i-1846f265  AdminEmail  dummy.email@domain.com" | grep -o -e "[._a-zA-Z0-9-]\+*@[._a-zA-Z0-9-]\+"

答案 4 :(得分:0)

当我看到“摘录”时,我想到grep

grep -o '\S*$' file

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:-1)

你试过了吗?

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

或按上述建议使用cut