如何编写find命令匹配多后缀文件,批量替换javax为jakarta?
递归替换.java和.xml文件中的"javax"为"jakarta"
推荐方案:用-name配合逻辑或(直观易读)
不需要复杂正则,直接用find的-o选项实现多后缀匹配,命令如下:
find . -name '*.java' -o -name '*.xml' | xargs sed -i 's/javax/jakarta/g'
如果你的项目里存在带空格的文件名,建议加上-print0和xargs -0避免出错:
find . -name '*.java' -o -name '*.xml' -print0 | xargs -0 sed -i 's/javax/jakarta/g'
正则匹配方案:正确使用-regex
你之前的正则写法错误,原因是find的-regex默认匹配完整文件路径,且默认使用基本正则表达式(BRE),以下是正确写法:
基本正则写法
find . -regex '.*\.\(java\|xml\)$' | xargs sed -i 's/javax/jakarta/g'
扩展正则写法(更简洁)
加上-regextype posix-extended后,可以使用更简洁的扩展正则语法:
find . -regextype posix-extended -regex '.*\.(java|xml)$' | xargs sed -i 's/javax/jakarta/g'
之前正则失败的原因
- 第一个正则
^.*\.(java|xml)$:默认BRE下|需要转义,且^锚定路径开头,但find返回的路径以./开头,写法不符合匹配规则; - 第二个正则
.*/^.*\.(java|xml)$:^是行首锚点,放在路径中间无意义,导致完全无法匹配任何文件路径。
内容的提问来源于stack exchange,提问作者Carla
相关产品推荐
相关产品推荐

