簡體   English   中英

如何在BASH Shell腳本中使用sed更改數組的內容?

[英]How do you alter the contents of an array with sed in BASH shell script?

我在當前目錄中創建了以.cpp結尾的所有文件的名稱數組,並希望創建以.cpp替換為.o的相同數組。

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

但是它不起作用,只有第一個參數將.cpp切換為.o

展開數組時,可以使用模式替換:

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

這是您要嘗試做的。

$ 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")'

使用全局填充來填充數組以安全地處理文件名。 不要解析ls

使用Shell參數擴展在每個數組元素上用.o替換.cpp

展開帶引號的數組並將結果存儲在新數組中。

不要使用ls獲取目錄內容以進行進一步處理。 正確處理其中包含空格和換行符的文件名將很困難。

最好使用以下find

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

現在答案不再是關於數組,而是因為我想指出,將ls的輸出存儲在數組中已經是問題的開始。 也許完全避免為此任務使用數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM