grep
私はシェルスクリプトに初めてアクセスし、さまざまな機能の使い方に関するチュートリアルを読んでいます。残念ながら、ほとんどのチュートリアルでは、通常、いくつかのパターンについてテキストファイルから文字列を特定する方法について説明します。
ただし、テキストファイルから2つの正確な文字列を検索しようとしています。
たとえば、私のコンテンツは次のようになりますBookDB.txt
。
Three Little Pigs : Mary Jane
Cinderella : Paul Johnson
read
この関数を使用してユーザー入力を取得しようとしています。
echo Title :
read Title
echo Author :
read Author
grep
次に、私は助けられたコマンドを使用しました。協会BookDB.txt
文字列を取得してファイルに存在することを確認し、echo $?
コマンド出力を変数に割り当てていくつかのメッセージを表示します。
grep -w "$Title" BookDB.txt
check1=`echo $?`
grep -w "$Author" BookDB.txt
check2=`echo $?`
if [ "$check1" -eq 0 ] && [ "$check2" -eq 0 ]; then
echo Found
else
echo Not Found
fi
Three
ユーザーがとをTitle
入力しても、Mary
コマンドはまだ0を返します。 0を返すたびに、テキストファイルに不要な情報をAuthor
表示します。echo$?
ベストアンサー1
これを行うとき:
check=`echo $?`
シェルが拡張されて$?
コマンドを形成echo $?
し、その出力を変数に割り当てます。コマンドの戻り状態を保存するには、ブローカーを削除して次のようにします。
check=$?
ただし、お客様の場合、返品ステータスを保存する必要はありません。ステートメント自体をif
テストできます。&&
したがって、2つの文字列を含むテキストファイルを見つけるには、次の手順を実行します。
if grep -qwF "$Author" "BookDB.txt" && grep -qwF "$Title" "BookDB.txt"; then
echo Yes
fi
このオプションは出力を-q
抑制しgrep
、-F
パターンを正規表現に解析しません。
しかし、あなたの例によると、最も探しているのはタイトルと作者の名前を含む行です。したがって、次のことを試すことができます。
if grep -q "^\\s*$Title\\s*:\\s*$Author\\s*\$" "BookDB.txt"; then
echo yes
fi
これを行うには、ユーザーはタイトル全体と著者名を入力して大文字と小文字を正確に入力する必要があります。たぶんあなたはもっと緩いものが欲しいかもしれません。
if grep -qi "$Title.*:.*$Author" "BookDB.txt"; then
echo yes
fi
大文字と小文字を区別せず、フルネームも必要ありません(John
両方john
とも一致JOHN CAVENDISH
)。タイトルも同じです。
MCVEをフォロー
echo Title:
read Title
echo Author:
read Author
if grep -qi "$Title.*:.*$Author" "BookDB.txt"; then
echo Found
fi
次の「BookDB.txt」ファイルに適用されます。
本のタイトル:著者
名本のタイトル:著者名本の
タイトル:著者名本
:著者名
テストケースbook
とauthor
。