私は、ユーザーが入力した単語がファイルに何回表示されるかをユーザーに知らせたいプログラムを持っています。これまでに書いた内容ですが動作しません。
#! /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
各一致を1行に個別に印刷すると、正しい数が表示されます
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}"