从第二个文本字符串中删除文本 -

时间:2014-09-24 16:03:17

标签: macos bash terminal filenames

我有许多文件具有以下格式:

misty mountains - final chapter-84jdodljdjlm.mp3
misty mountains - first chanpt-4jd0843l8.mp3
misty mountains - (final chapter) - fj084j4.mp3

我希望第一个-之前的所有文字和第二个-之前的所有文字。如何从文件名中提取此文本?或者最好在第二个-之后和.mp3

之前删除这些内容

3 个答案:

答案 0 :(得分:1)

这个awk单行可以帮助你:

awk -F- '{print $1,$2}'

用你的文字测试:

kent$  echo "misty mountains - final chapter-84jdodljdjlm.mp3
misty mountains - first chanpt-4jd0843l8.mp3
misty mountains - (final chapter) - fj084j4.mp3"|awk -F- '{print $1,$2}'
misty mountains   final chapter
misty mountains   first chanpt
misty mountains   (final chapter)

要列出所有文件,您可以尝试ls -1 *.mp3|awk ...

解决方案不是一般的解决方案,但我想这对您的要求很有帮助。

答案 1 :(得分:1)

使用Bash参数扩展

您可以使用Bash的内置参数扩展来从shell glob中删除部分文件名。例如

for file in *mp3; do
    echo "${file%-*}"
done

如果要重命名文件,而不是仅捕获或打印修改后的文件名,那么您可以将循环更改为以下内容而不是回显:

for file in *mp3; do
    mv "$file" "${file%-*}.mp3"
done

测试解决方案

测试代码

您可以提前测试一下,看看结果会是什么样子。例如:

files=(
    'misty mountains - final chapter-84jdodljdjlm.mp3'
    'misty mountains - first chanpt-4jd0843l8.mp3'
    'misty mountains - (final chapter) - fj084j4.mp3'
)
for file in "${files[@]}"; do echo "${file%-*}"; done

测试输出

misty mountains - final chapter
misty mountains - first chanpt
misty mountains - (final chapter)

答案 2 :(得分:0)

^(.*?)-|-(.*)$

试试这个。只需抓住捕获。参见演示。

http://regex101.com/r/zR2tR4/22