【问题标题】:extract subtring, splitting at pattern, using sed in bash script提取子字符串,在模式处拆分,在 bash 脚本中使用 sed
【发布时间】:2012-09-17 06:50:15
【问题描述】:

解决方案:

#!/bin/bash
for f in *.mp3; do
    d="${f% - *}"
    if [ -d $d ]; then
        mv "$f" "$d/";
    else 
        mkdir "$d" && mv "$f" "$d/";
    fi 
done

我正在尝试这个:

$ echo "foo - bar.ext" | sed 's/\('" - "'\).*/\1/' | sed 's/ - //'

这给了我“foo”。我想有更好的方法...不要打我,我是 sed 的新手。但是现在,如何将它包含在这样的循环中:

#!/bin/bash
for f in *.ext; do
    d="${f%.*}"
    #Extract Filename String before the " - " and write back to $d
    mkdir "$d" && mv "$f" "$d/";
done

提前致谢

更多信息:

$f 应保持不变,而存储在 $d 中的目录名称应仅包含匹配“foo - bar.ext”的模式的“foo”部分。

基本上,应将遵循“foo - bar.ext”模式的文件列表移动到名为“foo”的目录中。

例如: foo1 - bar1.ext foo1 - bar2.ext foo1 - bar2.ext --> 将被移动到子目录“foo1”

anotherfoo - anotherbar.ext --> 将被移动到子目录“anotherfoo”

【问题讨论】:

  • 请根据您的“foo - bar.ext”输入,编辑您的 Q 以包含 $d 和 $f 的预期最终值。祝你好运。
  • 完成,希望现在更清楚:-)
  • +1 适合初学者 S.O.题。请记住包括示例输入、一些必需的输出、您尝试过的代码以及您收到的错误消息,您将在此处获得非常快速的帮助。阅读stackoverflow.com/faq 以真正了解最新情况。祝你好运。

标签: bash shell sed


【解决方案1】:

你几乎已经拥有它了。您的代码片段中仅缺少三个字符。

#!/bin/bash
for f in *.ext; do
    d="${f% - *}"
    mkdir "$d" && mv "$f" "$d/";
done

【讨论】:

  • 哇,就这样?而且我一直在检查 sed。谢谢,效果很好。
  • 如果您有可以使用的解决方案,请接受答案。 (点击接受标志)
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 2020-12-04
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2017-11-04
  • 1970-01-01
相关资源
最近更新 更多