텍스트 파일에서 텍스트 줄을 검색하는 데 문제가 있습니다.
현재 나는 이 명령을 사용하고 있습니다.
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