我正在尝试使用 Bash 'expr index" 获取索引位置。
例如
$ 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。 是信息导致问题之后的时期吗? 如何解决此问题?
我遵循了高级 Bash 脚本指南 www.tldp.org/LDP/abs/html/。见表B-5一节。字符串操作
expr 索引 "$string" $substring $substring* 中第一个字符$string的数字位置,匹配 [0,如果没有匹配,第一个字符计为位置 1]
我尝试了一些简单的东西,它有效。
我在天鹅座运行狂欢。
$ ./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.
谢谢。
一般来说,除非你有很好的理由,否则你不应该使用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]
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
回显将您的字符串放入标准输出中,因此可以将其管道传输到 grep。
-b 打印所示字符串的字节偏移量。
-o 确保仅打印匹配的部分。
GNU expr
不匹配使用 index
的子字符串;相反,它从第一个字符串中查找任何字符的第一次出现。您的示例返回 4,因为字符串的第 4 个字符是"o",即"Mozilla"中的第一个字符,可在"Info.out..."中找到。
在bash
或expr
中都没有这种类型的内置函数,但是您可以通过首先从原始字符串中删除子字符串及其后的所有内容,然后计算剩余长度来间接获取给定子字符串的索引。
string="Info.out..."
substring=Mozilla
tmp=${string%%$substring*}
index=${#tmp}