
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
。
答え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、タイトルまたは作成者名にコロンが含まれているか、ユーザーが正規表現に特殊文字(例:^
、、、、、、、、$
\
*
[
]
.
、または時には(
、、、、、)
および)。{
}
?
+