![bash:意外标记‘|’附近的语法错误](https://linux22.com/image/1029530/bash%EF%BC%9A%E6%84%8F%E5%A4%96%E6%A0%87%E8%AE%B0%E2%80%98%7C%E2%80%99%E9%99%84%E8%BF%91%E7%9A%84%E8%AF%AD%E6%B3%95%E9%94%99%E8%AF%AF.png)
登录后,使用“查找”实用程序在当前文件夹中搜索名称与以下正则表达式模式匹配的文件:
- 小写字母
- 数字
- 特殊字符(% & # 或 -)
- 2 个小写字母
- 特殊字符(@:? 或 ;)
- 数字
- 大写字母
您需要使用的命令是:find ./ -regextype posix-extendet -regex
^.*\/~~~~~~~
其中~~~~~~~
用您的正则表达式字符串替换
我是一名高中生,我们有编程挑战要做,但我对编程不太了解。我已经尝试做这个挑战几天了,想出了这个字符串
find ./ -regextype posix-extended -regex ^.*[a-z]\d\%|&|#|-[a-z][a-z]\@|:|?|;\d[A-Z]
但当我尝试时弹出语法错误。我不知道如何修复它,但仍在尝试。如果可能的话,有人可以帮忙吗?
答案1
您收到的语法错误是因为正则表达式需要用单引号或双引号括起来。否则,竖线字符将被视为 Unix 管道,它会将管道前面的命令的标准输出重定向到管道后面的命令的标准输入。
然而,一旦解决这个问题,您将收到另一个错误:前面的正则表达式无效
$ find ./ -regextype posix-extended -regex "^.*\/[a-z]\d\%|&|#|-[a-z][a-z]\@|:|?|;\d[A-Z]"
find: failed to compile regular expression '^.*\/[a-z]\d\%|&|#|-[a-z][a-z]\@|:|?|;\d[A-Z]': Invalid preceding regular expression
这是因为您没有转义正确的字符。在作业中列出的字符中,只有问号需要转义。
对于这些特殊字符,正则表达式可以用字符类(开括号和闭括号)或替代字符(带有竖线字符)来定义。如果是替代字符,则应将它们分组在括号内。因此,您有两个选择:
$ find ./ -regextype posix-extended -regex "^.*\/[a-z]\d(%|&|#|-)[a-z][a-z](@|:|\?|;)\d[A-Z]"
或者以下内容。但请注意,由于此版本使用字符类括号,因此您不需要转义问号。
$ find ./ -regextype posix-extended -regex "^.*\/[a-z]\d[%&#-][a-z][a-z][@:?;]\d[A-Z]"
但这可能无法按预期工作,因为\d
。使用 POSIX 正则表达式,您需要使用 或[0-9]
。[[:digit:]]
否则,\d
将被解释为文字“d”。因此,最终命令如下:
$ find ./ -regextype posix-extended -regex "^.*\/[a-z][0-9][%&#-][a-z][a-z][@:?;][0-9][A-Z]"
或者...
$ find ./ -regextype posix-extended -regex "^.*\/[a-z][[:digit:]][%&#-][a-z][a-z][@:?;][[:digit:]][A-Z]"
附注:要查找两个小写字母,您可以使用[a-z]{2}
而不是[a-z][a-z]
。
如果可以的话,最后我想说的是……
在创建正则表达式或解决问题时,最好从小处着手,然后逐步完善。每次只改变一件事,确保它按预期运行,然后当它出现故障时,找出故障原因并进行相应调整。
答案2
在几乎所有情况下,都需要屏蔽正则表达式以防止 shell 解释它并提交已经(部分)解释的版本来查找。
find ./ -regextype posix-extended -regex "^.*[a-z][0-9][%&#-][a-z][a-z][@:?;][0-9][A-Z]"
根据您的需要,小写字母可能包含诸如这样的字符öäüö¢øßé
,但我不确定 find 是否接受这些字符的某些符号表示,而无需将它们全部列在方括号中。
我也为 [@:?;] 等使用了方括号,因为它比使用 OR 连接的列表短@|:|?|;
。据我所知,@ 不需要使用退格键进行屏蔽,百分号也是如此。
要捕获的文件名列表和不要捕获的文件名列表将会很有帮助。