Bash expr index命令

时间:2014-02-10 21:43:15

标签: bash

我试图使用Bash'expr index“来获取索引位置。

e.g。

$ echo `expr index "Info.out.2014-02-08:INFO|SID:sXfzRjbmKbwX7jyaW1sog7n|Browser[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0]" Mozilla`

我试图获取单词“Mozilla”的索引位置,然后使用索引值获取子字符串。

我得到的结果是4.这是信息问题之后的时期吗?我该如何解决这个问题?

我遵循了Advanced Bash脚本指南www.tldp.org/LDP/abs/html/。见表B-5。字符串操作

expr index“$ string”$ substring $ substring *中第一个字符的$ string中的数字位置匹配[0如果没有匹配,第一个字符计为位置1]

我尝试过一些简单的事情,但它确实有用。

我在cygwin中运行bash。

$ ./bash --version
GNU bash, version 4.1.10(4)-release (i686-pc-cygwin)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

感谢。

3 个答案:

答案 0 :(得分:9)

一般情况下,除非你有充分的理由,否则你不应该使用expr index

例如,假设您想获取浏览器名称。

s="Info.out.2014-02-08:INFO|SID:sXfzRjbmKbwX7jyaW1sog7n|Browser[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0]"

# strip everything up to and including the first instance of 'Browser['
browser="${s#*Browser[}"

# strip everything after the first ']', again, inclusive
browser="${browser%%]*}"

# ...and show the result...
echo "$browser"

这将返回:

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0

如果你真的想知道Mozilla之前有多少个字符,那么你也可以这样做:

s="Info.out.2014-02-08:INFO|SID:sXfzRjbmKbwX7jyaW1sog7n|Browser[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0]"

# strip everything after the first instance of 'Mozilla'
prefix=${s%%Mozilla*}

# count number of characters in the string
index=${#prefix}

# ...and show the result...
echo "$index"

这应该返回61

有关上述示例的“原因”和“方式”,请参阅BashFAQ #73


相比之下,要按|分隔符进行拆分,我个人会选择使用read,如BashFAQ #1中所述:

s="Info.out.2014-02-08:INFO|SID:sXfzRjbmKbwX7jyaW1sog7n|Browser[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0]"
IFS='|' read -r _ _ browser _
echo "$browser"

......会发出......

Browser[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0]

答案 1 :(得分:4)

expr index命令搜索您的第一个字符串,查找第二个字符串中任何字符的第一个匹配项。在这种情况下,它认识到字符'Mozilla'中的'o'匹配“Info.out ...”中的第4个字符

这使用它作为测试来看看会发生什么。它将返回4作为'd'的第一个匹配:

echo `expr index "abcdefghijklmnopqrstuvwxyz" xyzd`

这个应该做你想做的事:

echo "Info.out.2014-02-08:INFO|SID:sXfzRjbmKbwX7jyaW1sog7n|Browser[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0]" | grep -o -b Mozilla

echo将你的字符串放入stdout,因此可以通过管道输入grep。

-b打印显示的字符串的字节偏移量。

-o确保只打印匹配部分。

答案 2 :(得分:2)

GNU expr与使用index的子字符串不匹配;相反,它会查找第一个字符串中第一个出现的任何字符。您的示例返回4,因为字符串的第4个字符是“o”,“Mozilla”中的第一个字符位于“Info.out ...”中。

bashexpr中没有此类内置函数,但您可以通过先删除子字符串及其后的所有内容来间接获取给定子字符串的索引字符串,然后计算剩余长度。

string="Info.out..."
substring=Mozilla
tmp=${string%%$substring*}
index=${#tmp}