【问题标题】:Is this sed command valid?这个 sed 命令有效吗?
【发布时间】:2022-01-15 08:15:43
【问题描述】:

我有 2 行 sed 无法理解

我理解 sed 的语法是:

sed 选项 [脚本] [输入文件]

但是在下面的这个命令中没有输入文件我只是好奇这是在做什么,非常感谢任何帮助

1.

$(echo $d | sed 's/.*\///g')#
cat /kaldi/README | sed "s/akiplaner/${n}/g" >  extracted/$nf/etc/README #

*注意:下面是整个代码

for d in /dir1/dataset/audios/*; do
    echo $d
    n=$(echo $d | sed 's/.*\///g') #
    nf=${n}
    echo $n $a $nf
    mkdir -p extracted/$nf/wav
    mkdir -p extracted/$nf/etc
    rm -f extracted/$nf/etc/prompts-original
    rm -f extracted/$nf/etc/PROMPTS
    cat /kaldi/README | sed "s/akiplaner/${n}/g" >extracted/$nf/etc/README #

    for f in $d/*.wav; do
        n2=$(echo $f | sed 's/.*\///g')
        n3=$(echo $n2 | sed 's/\.wav//g') # removing .wav from $n2 string
        echo $n2
        echo $n3
        cp $f extracted/$nf/wav/$n2
        #sox --vol 0.01 $f -t wav extracted/$nf/wav/$n2;
        normalize-audio -a 0.3 extracted/$nf/wav/$n2

        cp $d/$n3.txt temp.txt

        echo "$n3 $(cat temp.txt)" >>extracted/$nf/etc/prompts-original
        echo "${nf}/mfc/${n3} $(cat temp.txt)" >>extracted/$nf/etc/PROMPTS
    done
    a=$(($a + 1))
done

【问题讨论】:

  • manual 表示“如果没有指定输入文件,则读取标准输入”。
  • 这里的标准输入是什么?
  • 我试图找出这里的模式,'s/.*\///g' 我说这个模式正在删除任何名称以 / 开头的文件或文件夹是正确的,所以基本上删除所有文件夹名,只留下最后一个文件夹名,例如,对于 L1/L2/L3,这只会留下 L3
  • 与您的问题没有直接关系,但使用n=${d##*/} 而不是n=$(echo $d | sed 's/.*\///g')。后者对于如此简单的任务来说太过分了。
  • 您的代码中存在一些基本问题。将它和您编写的任何其他 shell 脚本复制粘贴到 shellcheck.net(按照您使用的 ]bash](stackoverflow.com/questions/tagged/bash) 标记的指示)并在发布任何问题之前修复该工具告诉您的问题。

标签: bash shell sed


【解决方案1】:

没有输入文件我只是好奇这是在做什么

答案就在您的指尖。

$ LC_ALL=C sed --help
...
... if no input files are
specified, then the standard input is read.

注意:| shell 操作符将一个命令标准输出连接到另一个命令的标准输入。对于 shell 流和输入输出操作的基本介绍,互联网上肯定有无穷无尽的资源——这可能是研究其中一些的好时机,例如 https://mywiki.wooledge.org/BashGuide/InputAndOutput

sed OPTIONS [SCRIPT] [INPUTFILE]

是:

$ LC_ALL=C sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

[...] 中的内容是可选的... 代表可以重复的东西。


脚本存在人为问题 - 它会在名称中带有空格或换行符的文件名或名称中带有 * 的文件名上中断...记住使用 shellcheck 检查您的脚本 - 它会捕获此类错误。

's/.*///g' 我是否正确地说这种模式正在删除名称以

开头的任何文件或文件夹

line 的文本中删除 .* 之前的所有 / 斜线。您可以通过https://regexcrossword.com/ 和 sed 在这里https://www.grymoire.com/Unix/Sed.html 有趣地学习正则表达式。

basename "$n" 的写法很奇怪,而下一行只是basename "$n" .wav

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2018-11-26
    • 2017-04-18
    • 2023-04-06
    • 2017-03-11
    相关资源
    最近更新 更多