我正在尝试在perl脚本中使用awk语句,该脚本接受用户输入并搜索许多文本文件以查找以任何顺序匹配输入中的所有单词的行.为此,我能够在CLI上进行我想要的Awk搜索:
awk 'tolower($0) ~ / 204/ && / test/ && / leg/' *_Codes.txt
Run Code Online (Sandbox Code Playgroud)
这将返回引用文本文件中的行,其中包括以"204","test"和"leg"开头的单词,例如"在2045房间中测试左腿";
但是,当我尝试在Perl脚本中执行此操作时,将用户输入设置为变量并将其修改为包含&&运算符和斜杠,我没有得到任何回报.这就是我所拥有的:
my ($code_search, $code_set) = @_;
# Clean the input for awk
# trim whitespace from the ends
$code_search =~ s!(^\s+|\s+$)!!g;
# separate words with the && operator and slashes
$code_search =~ s!\s+!/ && / !g;
# make input lower case and tack on front and back slashes
my $sanitized_query = lc "/ ${code_search}/";
# at this point, a user input of '204 leg test'
# is transformed to '/ 204/ && / leg/ && / test/'
# and is saved to the $sanitized_query variable
# run the query through awk and save it to $results
my $results = `awk 'tolower($0) ~ \$sanitized_query' *_Codes.txt`;
Run Code Online (Sandbox Code Playgroud)
但是$results不给我任何东西.
也许awk不适合这里的工作,但它似乎比grep更适合我的需求,因为我想确保我可以搜索输入的所有术语并返回结果,它们都出现在一行中任何顺序的文字.
非常感谢任何帮助.
为什么不完全在perl中完成,而不是使用awk?您应该能够打开文件,读入每行并在正则表达式匹配时将其打印出来.正则表达式是perls最好的优势之一,为什么不直接利用它们而不是试图调用awk?
我看到使用awk的唯一优势是你必须手动列出所有*_Codes.txt文件,但在perl中这不应该太难.
假设您有一行文本,在perl中执行此操作的最简单方法就是运行正则表达式3次,每次尝试匹配一个部分.对于〔实施例,如果你想匹配204,test并且leg你应该能够做到
if (($line =~ m/ 204/i) && ($line =~ m/ test/i) && ($line =~ m/ leg/i)){
print $line;
}
Run Code Online (Sandbox Code Playgroud)