grep -o&#34; $ var&#34;档案| wc -l </ p>
当我更换&#34; $ var&#34;带有文本字符串,但不带变量。
我检查了&#34; $ var&#34;是一个字符串。
grep -o&#34; $ var&#34;档案| wc -l </ p>
当我更换&#34; $ var&#34;带有文本字符串,但不带变量。
我检查了&#34; $ var&#34;是一个字符串。
新
嗨,这是代码。 list.txt包含多行单词列表,每行包含一个单词。 source.txt是一个单行文件,由多个字符组成,没有任何空格。
#!/bin/bash
for i in $(seq 1 100)
do
word=$(sed "$i"'q;d' list.txt)
#remove the new line character
word=${word//$'\r\n'/}
grep -o "$word" source.txt | wc -l >>output
done
list.txt示例:
aa
bb
cc
示例source.txt:
aaccddffzzaabbhh
答案 0 :(得分:0)
您的问题必须与您开始时将字符串分配给var
的方式相同。你的grep
表达式的形式,包括变量都可以。假设PATH
中有.bashrc
- 如果没有分配与i
匹配的内容。尝试:
i=PATH; grep -o "$i" ~/.bashrc | wc -l
<强>输出:强>
5
很容易确认:
$ i=PATH; grep "$i" ~/.bashrc
export PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin
# PATH=$PATH:/usr/lib/festival/ ;export PATH
那是5
。如果您仍有问题,请发布如何将值分配给var
。
答案 1 :(得分:0)
您展示的内容应该按预期工作。它怎么会失败?
在任何情况下,计算anoter文件中每个单词列表出现次数的更好方法是:
#!/usr/bin/env bash
while read word
do
grep -oc "$word" source.txt >> output
done < <(sed 's/\r//' list.txt)
这里,我在删除Windows样式行结尾后使用while
循环来读取文件。然后,我使用grep的-c
选项来计算出现次数。在示例文件上运行时,会产生:
$ cat output
1
1
1
要计算一行中的多个匹配项,您可以尝试这样做:
while read word
do
export word;
perl -lne '@c=/$ENV{"word"}/g; $f=scalar @c; print $f if $f>0' source.txt
done < list.txt