我正在使用基本的搜索功能,我正在使用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”,它会起作用 - 输出:
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 ++”一书。还有其他方法可以达到预期的产量吗?我试图找到答案,但无济于事。
答案 0 :(得分:2)
您需要决定是否要在搜索中支持正则表达式。在任何情况下,您都必须使用read -r
标志来防止它解释转义序列,而是将它们作为文字文本读取。
如果要搜索固定字符串而不是模式,请使用awk中的index()
函数:
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
但是,如果它们出现在模式中,则需要转义特殊的正则表达式字符。来自+
的{{1}}是一个特殊的角色。
由于字符串被解析两次,一次由shell解析,一次由C++
解析,因此需要对其进行双重转义:
awk
答案 1 :(得分:0)
这是因为〜运算符的rvalue应该是正则表达式,而正则表达式中的+
具有特殊含义(它是一个量词:一次或多次)。< / p>
所以它匹配“Catch”中的C和“C ++”中的C,因为它们有一个或多个C.
如果你想搜索文字字符串“C ++”,你必须写“C\+\+
”