我面临在文本文件中搜索文本行的问题。
目前,我正在使用这个命令
check=`awk -F : -v "title=$title" 'tolower($1) ~ tolower(title)' test.txt`
Run Code Online (Sandbox Code Playgroud)
当字符串是纯字母字符时,它工作正常。假设文本文件包含 3 行字符串,它们是
C++ Programming in 21 Days
C## Programming in 21 Days
C Programming in 21 Days
Run Code Online (Sandbox Code Playgroud)
当我只对一个字母进行部分搜索时,C
将显示 3 个结果,这正是我想要的,但是,如果我键入C++ P
,我的程序将返回未找到的文本。如果我输入C++
,也会显示所有 3 个结果。
但有趣的是,如果我搜索C## P
,我的程序将返回C## Programming in 21 Days
found。
我似乎无法找出导致此错误的原因,请帮助。
tolower(title)
作为正则表达式处理:
C++
C
字面上匹配字符(区分大小写)
++
一次和无限次之间,尽可能多次,不回馈【占有】C
C
字面上匹配字符(区分大小写)
C##
C##
逐字匹配字符(区分大小写)
要获得正确的结果,C++
您需要模式C\+\+
例子
% title="C\+\+"
% awk -F : -v "title=$title" 'tolower($1) ~ tolower(title)' foo
C++ Programming in 21 Days
Run Code Online (Sandbox Code Playgroud)
或更短
% awk '/[Cc]\+\+/' foo
C++ Programming in 21 Days
% awk '/[Cc]##/' foo
C## Programming in 21 Days
% awk '/[Cc] /' foo
C Programming in 21 Days
Run Code Online (Sandbox Code Playgroud)
或使用外部变量
% 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
Run Code Online (Sandbox Code Playgroud)
等等
“+”被视为正则表达式。
$ 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
Run Code Online (Sandbox Code Playgroud)
如果您只对匹配开始感兴趣,您可以使用
$ awk -F: -v "title=$title" 'tolower(substr($0,0,length(title))) == tolower(title)' test.txt
Run Code Online (Sandbox Code Playgroud)
或者匹配行内的任何位置
$ 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
Run Code Online (Sandbox Code Playgroud)