我面临着搜索文本文件中的文本行的问题。
目前,我正在使用这个命令
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
(区分大小写)- 量词:
++
一次到无限次之间,尽可能多的次数,不归还[所有格]
- 量词:
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