gpt4 book ai didi

linux - 使用 awk 的 ~ 运算符

转载 作者:太空狗 更新时间:2023-10-29 11:12:55 25 4
gpt4 key购买 nike

我在使用 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++”这本书。还有其他方法可以达到预期的输出吗?我试图找到答案,但无济于事。

最佳答案

您需要决定是否要在搜索中支持正则表达式。在任何情况下,您都必须使用 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

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

由于字符串被解析了两次,一次被 shell 一次被 awk 解析,你需要对它进行双重转义:

Title: C\\+\\+

关于linux - 使用 awk 的 ~ 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34963330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com