使用awk的〜运算符

亚当·温菲尔德

我在bash上使用的基本搜索功能遇到问题。

基本上,我有一个$ file =“ Books.txt”,其中有用冒号分隔的值:

C++ Programming for Dummies:Bob:60:50:20
Catch Me If You Can: Mary Ann:40:30:20

前两列分别是标题和作者。我正在尝试按书名进行搜索。

read -p "Title: " searchTitle

到目前为止,我有以下代码:

awk -v findTitle="$searchTitle" 'BEGIN {FS=":"; OFS=", ";} $1 ~ findTitle {print $1, $2, "$"$3, $4, $5}' $file

如果我在提示符下输入“捕获”,它会起作用-输出:

Catch Me If You Can, Mary Ann, $40, 30, 20

但是,如果我搜索“ C ++”,它就会给我两个人-

Catch Me If You Can, Mary Ann, $40, 30, 20
C++ Programming for Dummies, Bob, $60, 50, 20

我的问题是:为什么?结果,我应该只会得到“ C ++”这本书。还有其他方法可以达到预期的输出吗?我试图找到答案,但无济于事。

hek2mgl

您需要确定是否要在搜索中支持正则表达式。在任何情况下,都必须使用读取-r标志来防止其解释转义序列,而应将其读取为原义文本。

如果要搜索固定字符串而不是模式,请index()在awk中使用该函数:

read -r -p "Title: " searchTitle
awk -F: -v OFS=", " -v search="$searchTitle" '
    index($1,search) {
        print $1, $2, "$"$3, $4, $5
    }
' books.txt

如果要支持正则表达式,则代码应如下所示:

read -r -p "Title: " searchTitle
awk -F: -v OFS=", " -v search="$searchTitle" '
    $1 ~ search {
        print $1, $2, "$"$3, $4, $5
    }
' books.txt

但是,如果特殊正则表达式字符出现在模式中,则需要对其进行转义。+C++这样一个特殊字符。

由于对字符串进行了两次解析,一次由shell解析,一次由解析awk,因此您需要对其进行两次转义:

Title: C\\+\\+

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章