Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用find和regex区分.h和.sh_Regex_Linux_Bash_Redhat - Fatal编程技术网

用find和regex区分.h和.sh

用find和regex区分.h和.sh,regex,linux,bash,redhat,Regex,Linux,Bash,Redhat,我正在尝试从目录中删除具有特定扩展名的文件。我使用的命令无法区分.h和.sh。我在哪里可以改进我的正则表达式 这是我当前的命令: find directory/ -type f -regextype posix-extended -regex '.*.(java|[hc]|cpp|hpp|cc|hh)' 目前它返回.csh和.sh文件。我不希望这种情况发生。当我删除“[hc]”时,这就解决了问题,但是我找不到任何.c或.h文件。我也试过了 find directory/ -type f -r

我正在尝试从目录中删除具有特定扩展名的文件。我使用的命令无法区分.h和.sh。我在哪里可以改进我的正则表达式

这是我当前的命令:

find directory/ -type f -regextype posix-extended -regex '.*.(java|[hc]|cpp|hpp|cc|hh)' 
目前它返回.csh和.sh文件。我不希望这种情况发生。当我删除“[hc]”时,这就解决了问题,但是我找不到任何.c或.h文件。我也试过了

find directory/ -type f -regextype posix-extended -regex '.*.(java|h|c|cpp|hpp|cc|hh)'

但这也会返回.csh和.sh文件。

添加一个输入结束锚点:

find ... -regex '.*\.(java|h|c|cpp|hpp|cc|hh)$'

这使列表成为一个绝对的扩展列表,而不仅仅是扩展的前缀。

您可以尝试避开点
*\。(java |[hc]| cpp | hpp | cc | hh)
btw
[hc]
与工作的第四鸟相同。谢谢大家!@代码是肯定的,但最小的更改强调了解决方案,而且我对您的建议也存在可读性问题——当您简单地列出您想要的内容时,更容易看到发生了什么。此外,您可以很容易地从文件内容构建普通正则表达式;当你进行微观优化时,你往往会失去simplicity@CodeManiac您的正则表达式错误地匹配了这里的最后两个测试字符串:您可以通过使用backreference使其工作,但是是的,如果您想看到一个工作的话,这将是@Bohemian建议的丑陋