shell 更改管道中的过滤器[重复]

h43kikqp  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(115)

这个问题已经有答案了

unix for loop modify the output filename(1个答案)
上个月关门了。
我有一个for循环,它接受具有一种扩展名的文件,但管道中的最后一个命令要求STDIN文件具有另一种扩展名。在我的管道中,我使用awk来更改文件类型,以便为最终命令正确格式化,但扩展名仍然链接到初始输入文件。
举例来说:

for file in *.AAA
do
commandA $file | awk ' { print } ' | commandB

commandB的典型用法:

commandB -i myfile.BBB

有没有一种方法可以在for循环和管道的中间更改文件的扩展名?

gorkyyrv

gorkyyrv1#

我认为你可以在for循环和管道的中间改变文件的扩展名,正如你所看到的,${file%.*}是一个很酷的技巧,基本上删除了文件扩展名(*.AAA),然后,我添加.BBB扩展名来创建新的文件名,我称之为new_file,最重要的是,我通过-i选项将这个修改后的文件传递给commandB

for file in *.AAA
do
    new_file="${file%.*}.BBB"  #change the extension to .BBB
    commandA "$file" | awk '{ print }' | commandB -i "$new_file"

或者你可以使用进程替换,所以我使用sed将文件名中的文件扩展名从.AAA更改为.BBB,然后,我使用称为进程替换的东西将这个花哨的修改后的文件名传递给commandB,它将命令的输出视为临时文件:

for file in *.AAA; do
    commandA "$file" | awk '{ print }' | commandB -i <(commandA "$file" | awk '{ print }' | sed 's/\.AAA$/.BBB/')
done

相关问题