我基本知道通配符用于在 shell 中进行文件名扩展。我还知道正则表达式用于文件内的文本模式匹配。但是,通配符是否也用于文件内的文本模式匹配?
任何指点都将不胜感激。
答案1
能通配符用于搜索文件内容?
假设文本文件...
简短回答... 是的,
较长的答案... Shell 方面... 在bash
以及其他一些 shell中ksh
,zsh
您可以像这样进行单词匹配:
$ for word in one two three; do
[[ "$word" = tw* ]] && echo "$word"
done
two
其中星号*
(也可以?
或[...]
)将对单词中的字母进行“匹配”(不是获取当前目录中的文件名) ... 那是仅有的如果它在扩展测试括号内使用(即双人间[[...]]
,而不是标准单人间[...]
)与=
或==
运算符...要理解通配符上例中的行为,请将其与运算符=~
(这使得右侧能够扩展正则表达式) 用于以下示例:
$ for word in one two three; do
[[ "$word" =~ tw* ]] && echo "$word"
done
two
three
但是,shell 的这种文本匹配功能仅适用于单个单词,在大多数情况下,您需要实现一种机制将整行分解为单个单词,然后才能有效地依赖它进行文本匹配(例如,您可以通过不在下一个示例中引用参数来允许 shell 的自然单词拆分发生$line
...请注意,这可能不是最好的机制,但它满足了我们此处示例的目的)...然后您可以在文件中搜索并匹配文本,例如:
$ cat file.txt
This is the first line.
This is the second line.
This is the third line.
This is the fourth line.
This is the fifth line.
$ while IFS= read -r line; do
for word in $line; do
[[ "$word" = f* ]] && echo "$line"
done
done < file.txt
This is the first line.
This is the fourth line.
This is the fifth line.
另一个文本示例(不是文件名) 可以在 shell 中用case ... esac
如下语句演示通配符:
#!/bin/bash
read -p "Enter Y/Yes, y/yes, N/No, n/no or D/d and one character/digit e.g. d2 :" reply
case "$reply" in
[Yy]* ) echo "Confirmed ... You entered $reply";;
[Nn]* ) echo "Denied ... You entered $reply";;
[Dd]? ) echo "Identified ... You entered $reply";;
* ) echo "Invalid ... You entered $reply";;
esac
运行时的行为如下:
$ Enter Y/Yes, y/yes, N/No, n/no or D/d and one character/digit e.g. d2 :yeah
Confirmed ... You entered yeah
$ Enter Y/Yes, y/yes, N/No, n/no or D/d and one character/digit e.g. d2 :nope
Denied ... You entered nope
$ Enter Y/Yes, y/yes, N/No, n/no or D/d and one character/digit e.g. d2 :D7
Identified ... You entered D7
$ Enter Y/Yes, y/yes, N/No, n/no or D/d and one character/digit e.g. d2 :D77
Invalid ... You entered D77
对于其他文本处理/匹配工具,如,,grep
...等,星号(awk
sed
*
也可以?
或[...]
) 用法/行为由工具手册定义,在大多数情况下它将是一个正则表达式运算符/量词,与 0 个或更多个前面的正则表达式匹配。
对于其他文件搜索工具(如find
、ls
、locate
... 等),星号*
(也可以?
或[...]
) 用法/行为也由工具手册定义,在大多数情况下将类似于 shell 的通配符的标准行为,并且将扩展为指定搜索目录中的文件/目录的名称,如果未指定搜索目录,则将扩展为当前工作目录中的文件/目录的名称。