[英]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.