awkを使用して文字を含む文字列を検索する

awkを使用して文字を含む文字列を検索する

テキストファイルからテキスト行を取得する際に問題があります。

現在私はこのコマンドを使用しています。

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

関連情報