我有这个程序,我想告诉用户用户输入的单词出现在文件中的次数。这是我到目前为止所写的,但它不起作用。
#! /bin/bash
echo "Enter the file that is to be searched (~/test/new)"
read location
echo "Enter the search term"
read search
$result = (grep -w "$search" $location | wc -w)
echo "The search term" $search "appears "$result" time/s in "$location
我能做些什么来让它发挥作用?
答案1
如果我理解正确的话,您想要的核心命令应该计算搜索到的单词的每次出现。假设 GNU grep:
<"$file" grep -Fwo -- "$word" | wc -l
选项-F
切换到非正则表达式、逐字字符串匹配。-w
进行单词搜索,就像在您的问题中一样,并-o
在其自己的行上单独打印每个匹配项,从而导致 发出正确的计数
wc -l
。
现在,关于提示,您可以利用 bash
read
有一个-p
选项:
read -p 'Filename: ' file
read -p 'Word: ' word
赋值采用 的形式var=value
,等号周围没有美元符号或空格:
count=$(grep-command)
最后,您可以在编写输出时利用字符串插值:
echo "File '$file' contains this many occurrences of '$word': $count."
答案2
在这里大胆猜测,因为我没有尝试任何东西。
波浪号扩展在变量中有点麻烦,因为它在变量 arte 扩展之前扩展。
对于没有波形符的文件名是否可以正常工作?
另外,您最好测试一些假设,例如$location
是否是一个可读文件。您可能想退出并显示一条有用的消息。这也可能会帮助您调试脚本。
答案3
tr -sc "\n$input" '[\n*]' <in | grep -xcFe"$input"
...可能会非常有效地做到这一点。但如果你只想匹配,它可能不会特别好所有的字。为此你可以这样做:
tr \[:space:]\[:punct:] '[\n*]' <in | grep -xcFe"$input"
...也许...
tr -c \[:alnum:]_ '[\n*]' <in | grep -xcFe"$input"
……只要你觉得最合适。
答案4
我更新了您尝试通过一些基本调试进行的操作,同时实现了我认为您想要的:
read -p "Please specify a location/file to be searched...Example=/var/tmp/test.txt : " location
while [[ ! -f ${location} ]] ; do
read -p "Unable to located file specified, please try again" location
done
read -p "Please specify a search term :" search
result=$(grep -w ${search} ${location} | wc -w)
echo "The search term ${search}, appears ${result} times inside of ${location}"