Sed

從變數值創建目錄內的目錄,以重定向 sed 的輸出

  • January 15, 2021

我正在嘗試獲取一個文件,通過使用 for 循環中的值(使用 sed)修改此文件,並將其重定向到在同一 for 循環期間創建的目錄。

原始文件 > 製作目錄 > 處理文件(進行更改) > 將輸出重定向到目錄

我的問題是用我的變數值創建目錄。

read NaMeoFFiLe
read startepsilonvalue
NaMeDiR="${startepsilonvalue}plus10steps"
mkdir "${NaMeDiR}"
for ((i=$stteps; i<=$lsteps; i+=1)); do
       k=$(bc <<<"""scale=1; $i /10")
       echo $k
       mkdir "${NaMeDiR}/${k}"
       ls "${NaMeDiR}"
       sed -e '0,/epsilon = ./{//c\epsilon = '"$startepsilonvalue" -e '}' \
                "${NaMeoFFiLe}" > "${k}_${NaMeiFFiLe}"
       cat "${NaMeDiR}/${k}/${k}_${NaMeoFFiLe}" &
done

問題是我可以在 for 循環之外創建第一個目錄,但是在 for 循環內部它只創建第一個和最後一個目錄,它不會執行 sed 命令的更改。

我得到的錯誤是該文件在我查找的目錄中不存在,這很明顯,因為該目錄尚未創建。

有什麼我想念的嗎?

該程式碼段中似乎有許多小東西可能會引起混淆。

首先,正如所寫,$k有時可以以點開頭(例如.1.2等),在 Unix 中,點將目錄定義為隱藏目錄。我要檢查的第一件事是這些目錄是否被創建為隱藏:

ls -A

其次,您正在創建${k}_${NaMeiFFiLe}父目錄,而不是您正在創建的新目錄。同樣,由於$k在許多情況下以點開頭,它可能隱藏在父目錄中。鑑於您的程式碼流程,我認為您的意思是將文件保存在新的子目錄中。如果為真,那看起來像這樣(...為了簡化,我將正則表達式替換為):

sed -e '...' "${NaMeoFFiLe}" > "${NaMeDiR}/${k}/${k}_${NaMeoFFiLe}"

順便說一句,mkdir有一個選項標誌-p可以創建完整的目錄層次結構,包括子目錄,這意味著您不需要外部循環mkdir

mkdir -p "${NaMeDiR}/${k}"

最後,作為一個更主觀的旁注,我建議重新考慮如何將變數名大寫,因為對於程式碼審閱者來說閱讀起來非常困難……我認為其他一些評論者已經發現了一些可能的錯別字避免使用更好的命名約定

引用自:https://unix.stackexchange.com/questions/629342