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快捷方式,用于在指定目录下的所有文件中查找和替换字符串

bash 4

查找子字符串在父串中的位置

关于在字符串中查找某一个字符的位置的方法

JavaSE8基础 String indexOf 正向 从指定索引值开始查找 字符在字符串中第一次出现的位置

Linux基础训练题型(下)