我想要一个脚本,用文件名中表示为XXXX-XX-XX的日期中的点替换连字符。所以叫做2019-09-05的东西移到2019.09.05。我研究了类似问题的其他解决方案,并提出了以下解决方案:
for file in *-*-*; do
mv "$file" "$(echo "$file" | sed s/*-*-*/*.*.*/)"
done
但是,所有这些操作是用一个称为。。*的单个文件替换所有由连字符分隔的文件。我不太确定bash regex是如何工作的,或者我需要如何格式化它的输出端才能使其正常工作。有什么想法吗?
答案 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