Bash:在OS X下查找字符串中字符的位置
Posted
技术标签:
【中文标题】Bash:在OS X下查找字符串中字符的位置【英文标题】:Bash: Find position of character in a string under OS X 【发布时间】:2013-07-11 01:05:33 【问题描述】:有没有办法在Mac OS X下的Bash中找到字符串中第一个字符的位置?
类似:
stringZ=abcABC123ABCabc # 6
echo `expr index "$stringZ" C12` # C position.
如Advanced Bash-Scripting Guide中所述
几个陷阱:
-
官方index函数
expr index $string $substring
不是
存在于 OS X (BSD) 匹配
安装 gnu match (gmatch) 似乎不是一个
BSD 系统领域的便携式解决方案
有什么想法吗?
【问题讨论】:
我没有要测试的 OS X,但echo $stringZ|grep C12 -o -b
能做到吗?
$ echo "ASDfsfssdf" | grep D -o -b 0:D
可以不带-o试试吗?在我的 bash 版本上,在 Linux 上,-b 的行为由 -o 更改,但从我在 Mac OS X 手册页中看到的内容来看,grep C12 -b
可能有效。
echo "ASDfsfssdf" | grep D -b 0:ASDfsfssdf
【参考方案1】:
这是一个可怕的 hack,可能不适用于所有情况。
tmp=$stringZ%%C12* # Remove the search string and everything after it
echo $(( $#tmp + 1 )) # Add one to the length of the remaining prefix
【讨论】:
我只是想提出同样的建议。%%
应该找到第一个匹配项。
%%
将删除最长的出现;两者都将从第一次出现开始。
双百分比似乎是要走的路。例如。试试这个:stringZ="A B=C=D=F" tmp=$stringZ%%=* # Remove the search string and everything after it echo $(( $#tmp + 1 )) # Add one to the length of the remaining prefix
单一百分比的工作方式如下:+ stringZ='A B=C=D=F' + tmp='A B=C=D' + echo 8 8
对于给定的应用程序(查找搜索字符串的索引),使用的模式将始终以*
结尾,在这种情况下%
和%%
之间没有区别。
【参考方案2】:
可能有点矫枉过正,但这样怎么样:
$ echo 'abcABC123ABCabc' | awk 'match($0,"C")print RSTART'
6
【讨论】:
以上是关于Bash:在OS X下查找字符串中字符的位置的主要内容,如果未能解决你的问题,请参考以下文章
sh bash快捷方式,用于在指定目录下的所有文件中查找和替换字符串