这个 sed 命令有效吗?

Is this sed command valid?

我有 2 行 sed 无法理解

我理解 sed 的语法是:

sed OPTIONS [SCRIPT] [INPUTFILE]

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

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

there is no input file I am just curious what this is doing

答案触手可及。

$ 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]...

[...]中的内容是可选的... 表示可以重复的内容。


脚本存在人为问题 - 它会在名称中包含空格或换行符的文件名或名称中包含 * 的文件名上中断...请记住使用 [=45= 检查您的脚本]check - 它会发现这样的错误。

's/.*///g' am I correct in saying this pattern is removing any file or folder whose name starts with

从文本的 中删除 / 斜线之前的所有内容 .*。您可以通过 https://regexcrossword.com/ and sed here https://www.grymoire.com/Unix/Sed.html .

有趣地学习正则表达式

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