我想知道在find命令中是否可以这样做。我试图找到所有与以下扩展名的具体文件,然后它将SED后。以下是我当前的命令脚本:
find . -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | xargs sed -i -e 's/%%MEFIRST%%/mefirst/g'
不幸的是,我对正则表达式不是很熟悉,但我需要这样的东西。
qf9go6mv1#
我在评论中看到,你发现了如何通过非标准标志find -regex RE使用GNU基本正则表达式对其进行转义,但你也可以指定一种支持它的正则表达式类型,而不需要任何转义,使其更清晰:在GNU findutils(Linux)中,使用-regextype posix-extended:
find -regex RE
-regextype posix-extended
find . -regextype posix-extended -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | …
在BSD find(FreeBSD find or Mac OS X find)中,使用-E:
-E
find . -E -regex '.*\.(sh|ini|conf|vhost|xml|php)$' | …
POSIX spec for find根本不支持正则表达式,但它支持通配符globbing和-o(表示“或”),所以你可以完全移植这个冗长的怪物:
-o
find . -name '*.sh' -o -name '*.ini' -o -name '*.conf' \ -o -name '*.vhost' -o -name '*.xml' -o -name '*.php' | …
确保这些globs被引用,否则shell将过早地扩展它们,您将得到语法错误(因为例如find -name a.sh b.sh …不会在两个匹配的文件 * 和 * 之间插入-o -name,它不会扩展到子目录中的文件)。我还猜测您需要-iregex或-iname而不是-regex或-name,因此搜索不区分大小写。
find -name a.sh b.sh …
-o -name
-iregex
-iname
-regex
-name
1条答案
按热度按时间qf9go6mv1#
我在评论中看到,你发现了如何通过非标准标志
find -regex RE
使用GNU基本正则表达式对其进行转义,但你也可以指定一种支持它的正则表达式类型,而不需要任何转义,使其更清晰:在GNU findutils(Linux)中,使用
-regextype posix-extended
:在BSD find(FreeBSD find or Mac OS X find)中,使用
-E
:POSIX spec for find根本不支持正则表达式,但它支持通配符globbing和
-o
(表示“或”),所以你可以完全移植这个冗长的怪物:确保这些globs被引用,否则shell将过早地扩展它们,您将得到语法错误(因为例如
find -name a.sh b.sh …
不会在两个匹配的文件 * 和 * 之间插入-o -name
,它不会扩展到子目录中的文件)。我还猜测您需要
-iregex
或-iname
而不是-regex
或-name
,因此搜索不区分大小写。