使用Linux外壳脚本的字符串在字符串中的位置?

hkmswyz6  于 2022-10-23  发布在  Linux
关注(0)|答案(6)|浏览(139)

如果将文本放在外壳变量中,则假定为$a

a="The cat sat on the mat"

如何使用Linux外壳脚本搜索“cat”并返回4,如果未找到则返回-1?

tquggr8v

tquggr8v1#

使用bash

a="The cat sat on the mat"
b=cat
strindex() { 
  x="${1%%"$2"*}"
  [[ "$x" = "$1" ]] && echo -1 || echo "${#x}"
}
strindex "$a" "$b"   # prints 4
strindex "$a" foo    # prints -1
strindex "$a" "ca*"  # prints -1
ncgqoxb0

ncgqoxb02#

您可以使用grep来获取字符串匹配部分的字节偏移量:

echo $str | grep -b -o str

如您的示例所示:

[user@host ~]$ echo "The cat sat on the mat" | grep -b -o cat
4:cat

如果你只想要第一部分,你可以用管道把它传给awk

echo $str | grep -b -o str | awk 'BEGIN {FS=":"}{print $1}'
cfh9epnr

cfh9epnr3#

我用awk来做这个

a="The cat sat on the mat"
test="cat"
awk -v a="$a" -v b="$test" 'BEGIN{print index(a,b)}'
p1iqtdky

p1iqtdky4#

echo $a | grep -bo cat | sed 's/:.*$//'
rn0zuynd

rn0zuynd5#

这只是Glenn Jackman的转义答案的一个版本,即基于相同原理的免费反向函数strrpos和Python风格的startswithendswith函数。
编辑:更新@Bruno的优秀建议。

strpos() { 
  haystack=$1
  needle=$2
  x="${haystack%%"$needle"*}"
  [[ "$x" = "$haystack" ]] && { echo -1; return 1; } || echo "${#x}"
}

strrpos() { 
  haystack=$1
  needle=$2
  x="${haystack%"$needle"*}"
  [[ "$x" = "$haystack" ]] && { echo -1; return 1 ;} || echo "${#x}"
}

startswith() { 
  haystack=$1
  needle=$2
  x="${haystack#"$needle"}"
  [[ "$x" = "$haystack" ]] && return 1 || return 0
}

endswith() { 
  haystack=$1
  needle=$2
  x="${haystack%"$needle"}"
  [[ "$x" = "$haystack" ]] && return 1 || return 0
}
eqqqjvef

eqqqjvef6#

这可以使用ripgrep(也称为rg)来完成。

❯ a="The cat sat on the mat"
❯ echo $a | rg --no-config --column 'cat'
1:5:The cat sat on the mat
❯ echo $a | rg --no-config --column 'cat' | cut -d: -f2
5

如果你想把它变成一个函数,你可以这样做:

function strindex() {
    local str=$1
    local substr=$2
    echo -n $str | rg --no-config --column $substr | cut -d: -f2
}

...并按如下方式使用:strindex <STRING> <SUBSTRING>

strindex "The cat sat on the mat" "cat"
5

您可以使用以下命令在MacOS上安装ripgrepbrew install --formula ripgrep

相关问题