如何使用BASH shell脚本中的sed更改数组的内容?

时间:2015-01-28 00:02:59

标签: arrays bash shell sed

我创建了当前目录中以.cpp结尾的所有文件的名称数组,并希望创建相同的数组,并将.cpp替换为.o

cppfield=$(ls *.cpp)
ofield=$(ls *.cpp | awk '{print}' ORS=' ' | sed s/.cpp/.o/g)

但是只有.cpp与.o

切换的第一个参数不起作用

3 个答案:

答案 0 :(得分:2)

展开数组时可以使用模式替换:

bash> a=(a.cpp b.cpp);
bash> a=("${a[@]/%.cpp/.o}");
bash> echo "${a[@]}";
a.o b.o

答案 1 :(得分:2)

这是你想要做的。

$ ls
a1.cpp  a2.cpp  a3.cpp  a4.cpp  a5.cpp  a6.cpp
$ cppfield=(*.cpp)
$ declare -p cppfield
declare -a cppfield='([0]="a1.cpp" [1]="a2.cpp" [2]="a3.cpp" [3]="a4.cpp" [4]="a5.cpp" [5]="a6.cpp")'
$ ofield=("${cppfield[@]/%.cpp/.o}")
$ declare -p ofield
declare -a ofield='([0]="a1.o" [1]="a2.o" [2]="a3.o" [3]="a4.o" [4]="a5.o" [5]="a6.o")'

使用globbing填充数组以安全地处理文件名。 Don't parse ls

使用Shell Parameter Expansion.cpp替换为每个数组元素上的.o

在引号中展开数组并将结果存储在新数组中。

答案 2 :(得分:0)

请勿使用ls获取目录内容以供进一步处理。很难处理正确包含空格和换行符的文件名。

最好像这样使用find

x() { sed 's/\.cpp$/.o/' <<< "$1"; }
export -f x
find . -maxdepth 1 -exec bash -c 'x "{}"' \;

现在答案不再是关于数组了,但那是因为我想指出将ls的输出存储在数组中已经是问题的开始。也许完全避免这个任务的数组。