【问题标题】:Bash: Find position of character in a string under OS XBash:在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中所述

几个陷阱:

  1. 官方index函数expr index $string $substring不是 存在于 OS X (BSD) 匹配
  2. 安装 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

标签: macos bash indexing match


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 2012-05-21
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2017-03-27
    相关资源
    最近更新 更多