Bash脚本用文件名中的点替换所有连字符

时间:2018-09-05 16:57:10

标签: bash

我想要一个脚本,用文件名中表示为XXXX-XX-XX的日期中的点替换连字符。所以叫做2019-09-05的东西移到2019.09.05。我研究了类似问题的其他解决方案,并提出了以下解决方案:

for file in *-*-*; do
    mv "$file" "$(echo "$file" | sed s/*-*-*/*.*.*/)"
done

但是,所有这些操作是用一个称为。*的单个文件替换所有由连字符分隔的文件。我不太确定bash regex是如何工作的,或者我需要如何格式化它的输出端才能使其正常工作。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

如果您使用的是纯bash环境,并且不介意可移植性,则可以使用parameters expansion

sed -e "s/-/./g"

如果您仍然想使用sed,只需将您所做的替换为*-*-*

编辑: 正如@pjh所说,for语句中使用的-也将检查连字符(mv -- "${file}" "${file//-/.}")开头的文件。

因此,最好避免使用mv "${file}" "${file//-/.}"而不是简单地使用this.state.array1.push来避免混淆,从而使脚本更加健壮。

答案 1 :(得分:3)

要保留三个部分,您需要用括号捕获,然后在替换字符串中使用反向引用(\1\2\3) 。此外,sed期望使用正则表达式,因此*变为.*

for file in *-*-*; do
    mv "$file" "$(echo "$file" | sed -r 's/(.*)-(.*)-(.*)/\1.\2.\3/')"
done

或者,您可以将破折​​号替换为点,而忽略中间的内容。

for file in *-*-*; do
    mv "$file" "$(echo "$file" | sed 's/-/./g')"
done

一种更简单的方法是使用bash语法而不是sed进行替换。

for file in *-*-*; do
    mv "$file" "${file//-/.}"
done