如何匹配bash脚本中文本文件中的字符串值

时间:2015-04-07 05:28:15

标签: arrays string bash file

我正在尝试阅读并显示文本文件中的每个单词,然后突出显示指定的元音或辅音。

当我从文件中读取时,我只能读取整行,所以我使用循环来读取行中的每个单词。但是,当我这样做时,我无法访问该单词中的不同位置。 (例如,如果单词是"快乐"我无法访问第二个位置的字母" a")

#READS EACH LINE
while read line
    do
            #READS EACH WORD IN THE LINE
            for word in $line
            do
                    #LOOPS THROUGH EACH CHARACTER IN THE WORD
                    for (( i=0; i<${#word}; i++ ))
                    do
                            #LOOPS THROUGH ALL VALUES IN VOWEL ARRAY
                            for (( j=0; j<10; j++ ))
                            do
                                    #MATCHES IF A VOWEL IS FOUND
                                    if [ "${word[$i]}" == "${varray[$j]}" ]
                                    then
                                            let vcount++
                                            echo i:$i  j:$j
                                            echo word: ${word[$i]} varray: ${varray[$j]}    #DEBUG

                                    fi
                            done
                    done
                                            #MORE CODE HERE DOING STUFF PRINTING TO SCREEN
            done
    done < $file

我做错了吗? 或者我应该以不同的方式阅读文件以访问该单词的每个字符?

当我echofor loop中的单词时,它会将整个单词显示为第一个位置,而不仅仅是第一个字符。而其他职位2,3等都是空的。

1 个答案:

答案 0 :(得分:0)

您似乎混淆了数组索引与获取字符串的子字符串(“substringing”,如果您愿意)。这些是我熟悉的每种编程语言中完全不同的操作。在bash中,数组索引是使用${arr[index]}形式的变量替换完成的。你需要的是${str:index:length}形式的变量替换,它做了子串。以下是如何使用它来使脚本工作:

#!/bin/bash

file='file';
varray='aeiouy';

#READS EACH LINE
while read line; do
    #READS EACH WORD IN THE LINE
    for word in $line; do
        #LOOPS THROUGH EACH CHARACTER IN THE WORD
        for (( i=0; i<${#word}; i++ )); do
            #LOOPS THROUGH ALL VALUES IN VOWEL ARRAY
            for (( j=0; j<${#varray}; j++ )); do
                #MATCHES IF A VOWEL IS FOUND
                wordChar="${word:$i:1}";
                vChar="${varray:$j:1}";
                if [[ "$wordChar" == "$vChar" ]]; then
                    let vcount++;
                    echo "i:$i  j:$j";
                    echo "wordChar: $wordChar vChar: $vChar";
                fi;
            done;
        done;
    done;
    #MORE CODE HERE DOING STUFF PRINTING TO SCREEN
done <$file;

exit 0;

演示:

cat file;
## abc def ghi
## jkl mno pqr

./script;
## i:0  j:0
## wordChar: a vChar: a
## i:1  j:1
## wordChar: e vChar: e
## i:2  j:2
## wordChar: i vChar: i
## i:2  j:3
## wordChar: o vChar: o

其他说明:

  • 您从文件中读取并将其分解为单词的代码就可以了。唯一需要注意的是read line命令会丢失前导和尾随空格。这对你的脚本来说并不重要,但是如果你想解决这个问题,你可以自己调用read,并将整行(包括前导和尾随空格)读入$REPLY变量默认情况下。
  • 在你的代码中,你将j从0迭代到9,但最大值取决于varray的长度(实际上是一个字符串;应该重命名),所以你应该使用{ {1}}作为最大值
  • 使用${#varray}进行表达式评估,而不是旧的[[ ... ]]表单;较新的形式稍微强大一些。