繁体   English   中英

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

[英]How to match string values from text file in bash script

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

当我从文件中读取时,我只能读取整行,因此我使用了循环来读取行中的每个单词。 但是,当我这样做时,我无法访问该单词的不同位置。 (例如,如果单词“ happy”是我不能访问字母“ 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

我做错什么了吗? 还是应该以不同的方式读取文件以便访问单词的每个字符?

当我在double for loop echo显单词时,它将整个单词显示为第一个位置,而不仅仅是第一个字符。 其余的位置2、3等为空。

您似乎将数组索引与字符串的子字符串混淆(如果愿意,请使用“ 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的长度(实际上是一个字符串;应该重命名该字符串),因此应将${#varray}用作最大值。
  • 使用[[ ... ]]进行表达式求值,而不要使用旧的[ ... ]形式; 较新的形式功能更强大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM