【问题标题】:How to iterate word by word in array in bash如何在bash中的数组中逐字迭代
【发布时间】:2017-06-03 17:24:40
【问题描述】:

我有一个简单的脚本,我从文件中搜索单词

words="you are hogan"

for i in $words; do
if grep -q "$i" text.txt; then
        echo "word(s) are exists"
        grep "$i" text.txt
else
        echo "word(s) are not exists"
fi
done

它有效,我可以逐字制作 grep。我的脚本是一样的:

grep "you" text.txt
grep "are" text.txt
grep "hogan" text.txt 

但是,我收到了另一个任务。我想逐字搜索和替换文字。 所以,我应该用单词创建第二个变量,我应该使用来自第一个变量$words 的单词。我怎么理解,我应该在一个循环中使用两个变量。我知道,在这种情况下我可以使用数组。 好的,让我们开始吧,我试着做 grep,就像第一个例子:

words="you are hogan"
words2="wwe wwf nukem"

for ((i=0;i<${#words[@]};++i)); do
if grep -q "${words[i]}" text.txt; then
        echo "word(s) are exists"
        echo "${words[i]}"
else
        echo "word(s) are not exists"
fi
done

结果不好。

+ (( i=0 ))
+ (( i<1 ))
+ grep -q 'you are hogan' text.txt
+ echo 'word(s) are not exists'
word(s) are not exists

你怎么看,它试图对所有短语进行 grep,而不是对每个单词。我如何为每个单词执行 grep 命令,例如第一个示例?

【问题讨论】:

标签: arrays bash for-loop if-statement grep


【解决方案1】:

您尝试将words 视为数组的第二种语法,但它是一个字符串。如果你希望它是一个数组,你可以用不同的方式初始化它:

words=("you" "are" "hogan")
for word in "${words[@]}"; do
    if grep -q "$word" text.txt; then
        printf 'Word exists: %s\n' "$word"
    else
        printf 'Word not found: %s\n' "$word"
    fi
done

如果您需要索引,也可以使用您的方法,这样您就可以访问其他字段中的相同索引。

【讨论】:

  • 它是一样的,我在第一个例子中使用。我需要在循环中使用两个变量。wordswords2
  • 是相同的输出,但它的关键不同在于它使用数组而不是带有分词的字符串,这是您需要的关键
  • @Piduna 同样,你还没有显示你想用第二个数组做什么,如果你想替换东西sed 会比grep 更好的选择
猜你喜欢
  • 2011-03-07
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
相关资源
最近更新 更多