我想要运行一个需要以逗号分隔的文件数组的程序,如下所示:
program -input1 A.txt,B.txt,C.txt -input2 D.txt,E.txt,F.txt -out out.txt
我的尝试:
我正在从名为 ProgramFolder 的文件夹运行命令,该文件夹还包含 file1.txt 和 file2.txt。file1.txt 和 file2.txt 包含程序的文件名称,例如:
File1:
A.txt,B.txt,C.txt
File2:
D.txt,E.txt,F.txt
但是“A.txt,B.txt,C.txt”和“D.txt,E.txt,F.txt”位于不同的文件夹中:源 1 和源 2,如下所示。
## file sources
source1= ~/Band/folder1/
source2= ~/Band/folder1/
我曾尝试通过以下方式运行该程序,但没有成功:
program -input $source1$(cat file1.txt) -input2 $source2$(cat file2.txt) -out out.txt
编写 bash 来运行该程序的最佳方法是什么?
答案1
您可以sed
在两个命令替换中使用来处理原始文件,然后再将它们列入程序的参数中(感谢steeldriver提供的简化模式):
program -input "$(sed "s@^\|,@&$source1@g" file1.txt)" -input2 "$(sed "s@^\|,@&$source2@g" file2.txt)"
我将sed
命令的默认分隔符(/
)更改为,@
因为$source1
和都$source2
将扩展为包含的路径/
;尽管如此,|
交替仍然是必要的。
sed
命令分解:
s
:断言执行替换@
:开始模式^\|,
: 匹配行首或,
字符@
:停止模式/开始替换字符串&
: 反向引用将扩展到匹配$sourceN
: 扩展为$sourceN
@
:停止替换字符串/启动修饰符g
:替换行中的每个匹配项
sed
对于给定的值$source1
,$source2
以及给定的file1.txt
和的内容,命令的示例输出file2.txt
:
user@debian ~/tmp % echo $source1
~/Band/folder1/
user@debian ~/tmp % echo $source2
~/Band/folder2/
user@debian ~/tmp % cat file1.txt
A.txt,B.txt,C.txt
user@debian ~/tmp % cat file2.txt
D.txt,E.txt,F.txt
user@debian ~/tmp % sed "s@^\|,@&$source1@g" file1.txt
~/Band/folder1/A.txt,~/Band/folder1/B.txt,~/Band/folder1/C.txt
user@debian ~/tmp % sed "s@^\|,@&$source2@g" file2.txt
~/Band/folder2/D.txt,~/Band/folder2/E.txt,~/Band/folder2/F.txt