【发布时间】:2016-08-19 00:38:04
【问题描述】:
我想重命名(在 bash 中)以特定字符串 'foo' 开头的文件列表,以未指定长度的随机字符串 'random1' 继续,并以另一个已知字符串 'bar' 继续。基本上来自“foo_random1_bar_random2”,我想要“foo_bar_random2”。我知道如何使用 sed 删除特定字符串,但不知道特定字符串之间长度未知的字符串。
【问题讨论】:
我想重命名(在 bash 中)以特定字符串 'foo' 开头的文件列表,以未指定长度的随机字符串 'random1' 继续,并以另一个已知字符串 'bar' 继续。基本上来自“foo_random1_bar_random2”,我想要“foo_bar_random2”。我知道如何使用 sed 删除特定字符串,但不知道特定字符串之间长度未知的字符串。
【问题讨论】:
使用 BASH 字符串替换:
f='foo_random1_bar_random2'
echo "${f/*bar/foo_bar}"
PS:根据下面的cmets,如果bar之前有下划线那么最好使用:
echo "${f/*_bar/foo_bar}"
输出:
foo_bar_random2
将mv 用作:
for f in foo_*bar_*; do
mv -i "$f" "${f/*_bar/foo_bar}"
done
【讨论】:
"${s/*_bar/foo_bar}" 很容易处理它,但 OP 没有指定下划线将始终存在于 bar 之前,正如您在回答中所假设的那样。
${f//}只能对*做贪婪匹配。
for i in foo_*_bar_*
do
j=$(echo "$i"|sed -e 's/foo_.*_bar_\(.*\)/foo_bar_\1/')
echo mv "$i" "$j"
done
这显示了mv 命令的列表。一旦您对命令感到满意,请删除 echo 之前的 mv 以便它们将被执行。
【讨论】:
如果您安装了rename 工具,您可以这样做
rename 's/foo_.*_bar/foo_bar/' files
【讨论】: