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

答え2

わかったまだどの入力からどの出力が欲しいのかはまだ言及されていないので、推測する必要があります。ユーザーがTitle="Three Little Pigs"and (またはファイルの別の行) を入力すると、1 つの操作 (例: 「Found」出力) を実行し、ユーザーが and (またはファイルのAuthor="Mary Jane"Title="Cinderella"の行) を入力すると、別の操作 (例: 「Not Found」出力) )を実行したいAuthor="Paul Johnson" ようです。ファイルの行)ユーザー入力その他 (例えば、Title="ThreeおよびAuthor="Mary"、またはTitle="Three Little Pigs"およびAuthor="Paul Johnson")。私はあなたが基盤を構築することをお勧めしますphkの答えそして

if grep "^\s*$Title\s*:\s*$Author\s*$" BookDB.txt > /dev/null
then
    echo "Found"
else
    echo "Not Found"
fi

または、最初の行を次のように変更できます。

if grep -x "\s*$Title\s*:\s*$Author\s*" BookDB.txt > /dev/null

メモ:

  • ^行の始まりを示します。
  • $行の終わりを示します。
  • したがって、以下を示します。^pattern$pattern 全体のラインを占めます。
  • grep -x "pattern"また示していますpattern 全体のラインを占めます。読んだらgrepを使用した正確な文字列の一致-wもう少し詳しく調べると、と混同したことがわかります-x
  • \s空白文字を表します。  \s*0 個以上の空白文字を表します。
  • 要約:このパターンは、行の先頭に0個以上のスペース文字、タイトル、0個以上のスペース、コロン、0個以上のスペース、作成者、および0個以上のスペースが続くことを意味します。行その他のコンテンツ)。
  • > /dev/null 一致する行が出力(つまり画面)に表示されるのを防ぐために使用されます。 〜のようにジウスティ-q(またはまたは--quiet--silentオプションを使用してこれを実行することもできます。

指摘したとおりPHK、タイトルまたは作成者名にコロンが含まれているか、ユーザーが正規表現に特殊文字(例:^、、、、、、、、$\*[].、または時には(、、、、、)および)。{}?+

関連情報