如何在 bash 命令行上使用 awk 的输出

How to use awk's output on bash command line

我有一个名为“01 - Welcome To The Jungle.mp3”的文件,我想eyeD3 -t "Welcome To the Jungle" 01 - Welcome To The Jungle.mp3修改文件夹中所有文件的标签。我用 awk 从文件中提取:"Welcome To The Jungle" 做:

#!/bin/bash
for i in *.mp3
do
eyeD3 -t $(echo ${i} | awk -F' - ' '{print }' | awk -F'.' '{print }') ${i}
done

没用。整个“$(echo S{i}....)”和“${i}”似乎都无法替换相应文件的名称。

您需要通过 shell 防止 IFS(默认值:space、制表符、换行符)上的分词,因为您的输入文件名包含 space(s) .典型的解决方法是在变量扩展周围使用双引号。

做:

for i in *.mp3; do eyeD3 -t "$(echo "$i")" | ...; done

您可以在此处利用字符串 <<< 来避免 echo-ing:

for i in *.mp3; do eyeD3 -t <<<"$i" | ...; done

您需要 double-quote 可能包含空格的变量,正如@heemayl 已经指出的那样。

另外,在这个例子中,没有使用 awk, 最好使用原生 Bash 模式替换来提取标题,例如:

for file in *.mp3; do
    title=${file%.mp3}
    title=${title#?????}
    eyeD3 -t "$title" "$file"
done

即:

  • 去掉最后的.mp3
  • 去掉前5个字符(计数前缀NN -