【发布时间】: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) 标记的指示)并在发布任何问题之前修复该工具告诉您的问题。