我在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 ++”这本书。还有其他方法可以达到预期的输出吗?我试图找到答案,但无济于事。
您需要确定是否要在搜索中支持正则表达式。在任何情况下,都必须使用读取-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] 删除。
我来说两句