我需要确定字符串中字符的位置。
例如,字符串是RAMSITALSKHMAN|1223333
.
grep -n '[^a-zA-Z0-9\$\~\%\#\^]'
如何找到|
给定字符串中的位置?
答案1
您可以使用-b
来获取字节偏移量,该偏移量与简单文本的位置相同(但不适用于 UTF-8 或类似文本)。
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|'
14:|
在上面,我使用-a
开关告诉 grep 将输入用作文本;操作二进制文件时必需的,并且-o
切换为仅输出匹配的字符。
如果您只想要位置,可以使用 grep 只提取位置:
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' | grep -oE '[0-9]+'
14
如果您得到奇怪的输出,请检查 grep 是否启用了颜色。您可以通过传递--colors=never
给 grep 或在 grep 命令前添加 a 来禁用颜色\
(这将禁用任何别名),例如:
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' --color=never | \grep -oE '^[0-9]+'
14
对于返回多个匹配项的字符串,通过管道传递head -n1
以获取第一个匹配项。
请注意,我在上面使用了两者,并请注意,如果 grep 通过可执行文件(脚本或其他)“别名”,则后者将不起作用,只有在使用别名时。
答案2
如果您正在使用巴什shell,您可以使用纯粹的内置操作,而不需要生成外部进程,例如grep或者awk:
$ str="RAMSITALSKHMAN|1223333"
$ tmp="${str%%|*}"
$ if [ "$tmp" != "$str" ]; then
> echo ${#tmp}
> fi
14
$
这使用了一个参数扩展删除所有出现的|
任何字符串并将其保存在临时变量中。然后只需测量临时变量的长度即可获得 的索引|
。
请注意,if
正在检查|
原始字符串中是否存在。如果没有,那么临时变量将与原始变量相同。
另请注意,这提供了从零开始的索引,|
在索引 bash 字符串时通常很有用。但是,如果您需要基于一的索引,那么您可以这样做:
$ echo $((${#tmp}+1))
15
$
答案3
尝试:
printf '%s\n' 'RAMSITALSKHMAN|1223333.' | grep -o . | grep -n '|'
输出:
15:|
这将为您提供索引基于 1 的位置。
答案4
我们还可以使用“expr match”或“expr index”来做到这一点
expr 匹配 $string $substring,其中 $substring 是 RE。
echo `expr match "RAMSITALSKHMAN|1223333" '[A-Z]*.|'`
上面会给你位置,因为它返回匹配的子字符串的长度。
但更具体地说是搜索索引:
mystring="RAMSITALSKHMAN|122333"
echo `expr index "$mystring" '|'`