我尝试重命名一堆文件名,以便使用 sed 将句点(最后一个除外)替换为连字符。
我尝试过这种方法(见下文),但是没有效果...脚本有什么问题?
echo "test.test.test.txt" | sed -e "s/\.(?=.*\.)/-/g"
结果:
test.test.test.txt
而不是期望的:
test-test-test.txt
我尝试重命名一堆文件名,以便使用 sed 将句点(最后一个除外)替换为连字符。
我尝试过这种方法(见下文),但是没有效果...脚本有什么问题?
echo "test.test.test.txt" | sed -e "s/\.(?=.*\.)/-/g"
结果:
test.test.test.txt
而不是期望的:
test-test-test.txt
假设您想要用 重命名这些文件
mv
,并且每个文件名都在变量中$file
,那么您可以使用 bash 正则表达式将其拆分为几部分,并使用 bash 参数扩展将其转换.
为-
:输出:
使用任何 sed 您可以将全部
.
s 更改为-
s ,然后将最后一个-
更改回 a.
:使用 GNU awk 或其他支持非 POSIX 扩展的第 3 个参数的程序
match()
,gensub()
您可以执行以下操作:Sed 不支持前瞻,因为它不是基本正则表达式的一部分。
有几种方法可以得到你想要的东西:
改用 Perl:
反转字符串,并替换
.
除第一个之外的所有内容,然后再将其反转回来:循环中一次替换一个,直到模式空间中不再有两个点:
用换行符替换最后一个点,然后用 替换所有点
-
,然后用点替换换行符。使用 GNU ,将除最后一个字段之外的所有字段的
awk
字段分隔符从 更改为.
:-
使用 GNU
sed
这可能对你有用(GNU sed):
使用贪婪来选择最后一个
.
并将其重命名(在本例中为\n
换行符)。然后使用翻译将所有其他的 替换
.
为-
,并将重命名的.
(我使用换行符,因为它不能出现在原始模式空间中)替换回.
。