地带whitspace并小写达连字符 - 文件名(Strip whitspace and make

2019-11-03 08:16发布

我有很多的,我正与一个特定的格式重新命名的文本文件。 下面我能够删除空格,使小写。 然而,这不是理想的结果。

我将如何能够格式化(去掉空格,使小写)一切行动的连字符,然后连字符后仅取第一个空格?

find /temp/ -depth -name "* *" -type f -exec rename 's/ +\././; y/A-Z /a-z_/' {} +

输入结果:

Hello Video - KEEP.txt

输出:

hello_video_-_keep.txt

期望的结果:

hello_video_-KEEP.txt

Answer 1:

如果这是一个文件,我会用:

sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1-\U\2/' -e 's/ /_/g' file
  • s/^([^-]*)-\s*([^\.]*)/\L\1-\U\2/转换为小写一切从文件之初到破折号- 然后将其转换为大写达点。
  • s/ /_/g所有空格转换为下划线_

为了您给定的文本,它返回:

hello_video_-KEEP.txt

如果你想保留这个词,因为它是从-高达. ,使用\E来恢复的情况。 然后,我们也可以摆脱多余的_-通过替换它只是-有点难看,我知道)。

$ cat file
Hello Video - KEEP.txt
My File - KeEp.txt
$ sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g' file
hello_video-KEEP.txt
my_file-KeEp.txt

作为提醒,这些都是以改变上/下壳体的方法:

  • \L -将所有出发字符转换为小写
  • \U -将所有出发字符为大写
  • \E -把所有字符继续在他们目前的情况下,

你怎么可以标记它的工作? 通过结果循环find命令:

while read -r file
do
   new_file=$(echo "$file" | sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g')
   echo "mv '$file' '$new_file'"
done < <(find . -type f ...)

对于给定的输入,这将产生这样的内容:

mv './My File - KeEp.txt' './my_file-KeEp.txt'
mv './Hello Video - KEEP.txt' './hello_video-KEEP.txt'

一旦你确定它的工作原理,只是删除了echo ,并使用mv孤单。 注意引号是必要的! 否则,将不能正确处理文件名中的空间。



Answer 2:

您可以使用\L要转换为小写:

rename 's/ +\././; y/ /_/; s/(.*?-)/\L$1/'


文章来源: Strip whitspace and make lower case up to hyphen - filename