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

한 문자에 대해 부분 검색을 수행하면 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

관련 정보