使用 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(区分大小写)

    • 量词:++一次到无限次之间,尽可能多的次数,不归还[所有格]
  • 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

相关内容