grepを使用して、テキストファイル内の正確な2つの文字列を確認してください。

grepを使用して、テキストファイル内の正確な2つの文字列を確認してください。

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」ファイルに適用されます。

本のタイトル:著者
名本のタイトル:著者名本の
タイトル:著者名本
:著者名

テストケースbookauthor

おすすめ記事