如何在 bash 中查找字符串中单词的索引?

如何在 bash 中查找字符串中单词的索引?

在 Bash 脚本中,

我有一个字符串,其中包含几个由一个或多个空格分隔的单词。即:

Name   Age Sex  ID         Address

如果我想查找任何一个单词,比如我想查找单词“Age”的索引,我该怎么做?

是否有任何命令可以直接返回我想要的单词的索引号?

谢谢。

答案1

Bash 执行单词拆分字符串本身——事实上,避免这种情况往往是一个问题,这也是引用如此重要的原因。在你的案例中很容易利用这一点:只需将字符串放入数组中而不引用它——bash 将使用分词来分隔各个元素。假设你的字符串存储在变量中$str

ar=($str) # no quotes!

将返回一个包含 5 个元素的数组。数组索引是单词索引(从 0 开始计数,就像在大多数脚本和编程语言中一样),例如“Age”使用以下方式访问

${ar[1]}  # 0 => Name, 1 => Age, 2 => Sex, 3 => ID, 4 => Address

或者,如果您需要按内容查找元素索引,请循环遍历数组,即

function el_index {
    cnt=0; for el in "${ar[@]}"; do
        [[ $el == "$1" ]] && echo $cnt && break
        ((++cnt))
    done
}
el_index "Age" # => 1

答案2

$ export FOO="Name   Age Sex  ID         Address"

用 Age 替换 *Age - 这将删除“Age”之前的所有内容:

$ echo ${FOO/*Age/Age}
Age Sex ID Address

获取“年龄”之前的任意内容

$ echo ${FOO/Age*/}
Name

获取该字符串的长度(即“Age”的索引):

$ BEGIN=${FOO/Age*/}
$ echo ${#BEGIN}
7

答案3

这是一个 7 年前的问题,但有些人可能需要纯 bash 的答案。

STRING="Name   Age Sex  ID         Address"
INDEXOF_AGE=${#${STRING/Age*/}}
echo $INDEXOF_AGE

答案4

笔记:假设这里的索引是指你想知道哪个单词它是(从 0 开始),而不是哪个特点在单词开头的字符串中。其他答案针对的是后者。

据我所知,没有,但你可以做一个。两个技巧:

  1. 使用天生的能力为了构造以通过空格分割未引用的输入。
  2. 处理找不到所需列的情况。在这种情况下,我选择将找到的索引发送给 stout,并让状态代码指示查找是否成功。还有其他可能性。

代码:

#!/bin/bash
find_index() {
    local str=$1
    local search=$2
    let local n=0
    local retval=1 # here, 1 is failure, 0 success
    for col in $str; do # $str unquoted -> whitespace tokenization!
    if [ $col = $search ]; then
        echo $n
        retval=0
        break
    else
        ((n++))
    fi
    done
    return $retval
}

test="Name   Age Sex  ID         Address"
idx=`find_index "$test" Age`
if [ $? -ne 0 ]; then
    echo "Not found!"
else
    echo "Found: $idx"
fi

相关内容