テキストファイルからテキスト行を取得する際に問題があります。
現在私はこのコマンドを使用しています。
check=`awk -F : -v "title=$title" 'tolower($1) ~ tolower(title)' test.txt`
文字列が純粋なアルファベット文字の場合はうまく機能します。テキストファイルに3行の文字列が含まれているとします。
C++ Programming in 21 Days
C## Programming in 21 Days
C Programming in 21 Days
1文字の部分検索を実行すると、C
必要に応じて3つの結果が表示されます。ただし、 を入力すると、C++ P
プログラムで見つからないテキストを返します。と入力すると、C++
3つの結果もすべて表示されます。
しかし、興味深いのは、検索するとC## P
私のプログラムがC## Programming in 21 Days
見つかったという結果を返すことです。
このエラーの原因は不明です。助けてください。
答え1
tolower(title)
正規表現として扱われる:
C++
文字通りマッチングC
(大文字と小文字の区別)- 数量者:
++
1回から無限回まで、できるだけ多く、返品なしで[小遊撃]
- 数量者:
C
文字通りマッチングC
(大文字と小文字の区別)C##
文字通りマッチングC##
(大文字と小文字の区別)
正しい結果を得るにはC++
パターンが必要ですC\+\+
はい
% title="C\+\+"
% awk -F : -v "title=$title" 'tolower($1) ~ tolower(title)' foo
C++ Programming in 21 Days
またはより短い
% awk '/[Cc]\+\+/' foo
C++ Programming in 21 Days
% awk '/[Cc]##/' foo
C## Programming in 21 Days
% awk '/[Cc] /' foo
C Programming in 21 Days
または外部変数を使用してください
% title='C## P'
% awk '/'"$title"'/' foo
C## Programming in 21 Days
% title='C\+\+ P'
% awk '/'"$title"'/' foo
C++ Programming in 21 Days
% title='C\+\+ P'
% check=$(awk '/'"$title"'/' foo)
% echo $check
C++ Programming in 21 Days
など。
答え2
「+」は正規表現として扱われます。
$ title="C++ P"
$ awk -F: -v "title=$title" 'tolower($1) ~ tolower(title)' test.txt
C Programming in 21 Days
$ title="C.. P"
$ awk -F: -v "title=$title" 'tolower($1) ~ tolower(title)' test.txt
C++ Programming in 21 Days
C## Programming in 21 Days
試合開始にのみ興味がある場合は、次のものを使用できます。
$ awk -F: -v "title=$title" 'tolower(substr($0,0,length(title))) == tolower(title)' test.txt
またはライン内のどこでも一致
$ title="C"
$ awk -F: -v "title=$title" 'index(tolower($0),tolower(title))' test.txt
C++ Programming in 21 Days
C## Programming in 21 Days
C Programming in 21 Days
$ title="C++ P"
$ awk -F: -v "title=$title" 'index(tolower($0),tolower(title))' test.txt
C++ Programming in 21 Days
$ title="C## P"
$ awk -F: -v "title=$title" 'index(tolower($0),tolower(title))' test.txt
C## Programming in 21 Days