2016-11-08 18 views
2

我在bash腳本中使用sed來更改某些變量值。這些變量是不同類型的混合物,還包括一些特殊字符:sed找不到文件

sed -i -e "s/NPROC=[^,]*,/NPROC=$NPROC/" \ 
     -e "s/NFRPOS=[^,]*,/NFRPOS=$OUTPUTFREQ/" \ 
     -e "s/NFRHIS=[^,]*,/NFRHIS=$OUTPUTFREQ/" \ 
     -e "s/COSP_OUTPUT_FREQUENCY=[^,]*,/COSP_OUTPUT_FREQUENCY=$OUTPUTFREQ/" \ 
     -e "s/TSTEP=[^,]*,/TSTEP=$TSTEP/" \ 
     -e "s/NCEXTR=[^,]*,/NCEXTR=$NCEXTR/" \ 
     -e "s/NVXTR2=[^,]*,/NVXTR2=$NVXTR2/" \ 
     -e "s/NVEXTR=[^,]*,/NVEXTR=$NVEXTR/" \ 
     -e "s/COSP_NLEVELS=[^,]*,/COSP_NLEVELS=$NLEV/" \ 
     -e "s/NVEXTRAGB=[^,]*,/$NVEXTRAGB/" \ 
     -e "s/NVEXTR2GB=[^,]*,/$NVEXTR2GB/" \ 
     -e "s/NFPLEV=[^,]*,/NFPLEV=$NFPLEV/" \ 
     -e "s/CNMEXP=[^,]*,/CNMEXP=\"${EXPID}\"/" \ 
     -e "s/LFPOS=[^,]*,/NFPOS=2/" \ 
     -e "s/NLAT=[^,]*,/NLAT=$NLAT/" \ 
     -e "s/NLON=[^,]*,/NLON=$NLON/" \ 
     $NAMELIST 


+ sed -i -e 's/NPROC=[^,]*,/NPROC=10/' ' ' 
sed: can't read : No such file or directory 

不過,我不斷收到該文件$ NAMELIST不能被發現的錯誤。該文件確實存在於相同的目錄中,並且名稱中沒有錯誤。添加完整路徑也無濟於事。所以我想知道這個sed命令有什麼問題。

+0

原始錯誤'$ NAMELIST無法找到'在哪裏?新的錯誤很容易理解。你可能有一個額外的錯誤'/ path/to/namelist:Permission denied'。 – alvits

+0

錯誤是在續行後添加了一個空格。 – Shejo284

回答

3

第一個反斜槓後面有一個空格。不是轉義換行來繼續執行命令,而是轉義空間,所以它認爲要編輯的文件的名稱是一個空格。

確保反斜槓是每一行上的最後一個字符。

+0

這是問題所在。謝謝:-)很難注意到一個空的空間。 – Shejo284

+1

您可以使用文本編輯器自動刪除行中的尾部空格,或至少顯示不可見的字符(如空格)。無論如何,我個人並不喜歡延續線,正是因爲這類問題。 – user1934428

+0

好點。我在終端模式下使用emacs,所以我沒有看到問題。另外,在這種情況下,人們必須知道空間會導致這樣的錯誤。目前尚不清楚這種良性可能會導致這樣的問題。 – Shejo284

0

無論出於何種原因,您的NAMELIST變量未被擴展。 Sed正在尋找名爲「$ NAMELIST」而不是「/the/path/to/namelist.txt」的文件...

檢查設置NAMELIST變量的邏輯。

+0

將完整路徑添加到文件並使名稱明確無助。我是新來的sed,所以我懷疑我錯過了命令中的某些東西。 – Shejo284

0

另一種解釋是,NAMELIST字面上包含短語「無法讀取」。惠普:

$ NAMELIST="can't read " 
$ sed -e 1d "$NAMELIST" 
sed: can't read : No such file or directory 

你是如何設置NAMELIST

+0

呵呵......我在Bash編碼方面並沒有那麼糟糕。名稱列表= namelist.t255。 – Shejo284