2015-04-07 86 views
0

我想要读取并显示文本文件中的每个单词,然后突出显示指定的元音或辅音。如何在bash脚本中匹配文本文件中的字符串值

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

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

当我echo双字for loop中的单词将整个单词显示为第一个位置而不是第一个字符。其余的位置2,3等都是空的。

回答

0

你似乎混淆了数组索引和取一个字符串的子串(如果你愿意的话)。在我熟悉的每种编程语言中,这些都是完全不同的操作。在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变量。
  • 在您的代码中,您从0到9迭代了j,但最大值取决于varray(实际上是一个字符串;可能应该重命名)的长度,因此您应该使用${#varray}作为最大值。
  • 使用[[ ... ]]进行表达式评估而不是旧的[ ... ]表单;新形式稍微强大一些。
+0

谢谢你的回答,它为我澄清了一些事情。我设法让我的脚本匹配元音:D。现在,当我根据元音的数量添加具有不同条件的IF语句时,无论是否有元音,它总是会输入相同的IF语句? – hotlinks0

相关问题