我有很多文本文件,我使用特定格式重命名。下面我能够删除空格并制作小写。但是,这不是理想的结果。
我如何能够在连字符上格式化(取出空格并制作小写)所有内容,然后在连字符后面只取第一个空格?
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
答案 0 :(得分:3)
如果是我要使用的文件:
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
即可。注意报价是必要的!!否则,它无法正确处理文件名中的空格。
答案 1 :(得分:1)
您可以使用\L
转换为小写:
rename 's/ +\././; y/ /_/; s/(.*?-)/\L$1/'