我是bash和学习sed
,awk
的强大工具的新手,还有更多这个平台提供的功能。在我的linux框中,我有一个包含子目录的音乐目录。这些子目录在名称中有大写。我试图使该音乐目录中的所有文件夹小写并删除间距。除了在子目录名称中删除空格之外不更改最后一个连字符之后的任何内容。文件可能有许多连字符。我只是考虑到最后一个。我怎么能这样做?
while read -r file; do
new_file=$(echo "$file" | sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g')
if [ "$file" != "$new_file" ]; then
mv "$file" "$new_file"
fi
done
例如:
输入
New- Survivor - Eye Of The Tiger – 12wOlL
所需结果:
new-survivor_-_ eye_of_the_tiger-12wOlL
当前结果:
new-Survivor_-_ Eye_of_The_Tiger-12wOlL
答案 0 :(得分:1)
更改您的sed命令,如下所示,
$ echo 'New- Survivor - Eye Of The Tiger – 12wOlL' | sed -re 's/^([^-]*-)\s*([^–]*)\s*–/\L\1\L\2–/;s/ /_/g;s/_-_/_-_ /g;s/_–_/-/g'
new-survivor_-_ eye_of_the_tiger-12wOlL
答案 1 :(得分:1)
您可以使用此sed
命令:
s='New- Survivor - Eye Of The Tiger - 12wOlL'
echo "$s" | sed 's/^\(.*\)\(-[^-]*\)$/\L\1\E\2/; s/ *- */-/; s/^\(.*\) \+- *\([^-]*\)$/\1-\2/; s/ /_/g'
new-survivor_-_eye_of_the_tiger-12wOlL