Linux

Bash:使用文件輸入執行 sed 操作

  • August 11, 2019

我正在嘗試在帶有文件作為輸入的 bash 腳本中使用 sed。當我在命令行中執行相同的命令時,它可以工作。但是當我使用 sed 命令將該文件用作腳本的輸入時,我得到

sed: can't read : No such file or directory

在命令行上:

sed -i 's/.*abd.*/xyz/ input.txt

當我使用多個 sed 命令將其製成腳本並將文件作為輸入傳遞時,它不起作用。

在我嘗試過的腳本中(沒有一個起作用)

sed -i 's/.*abd.*/xyz/' < "$1"

sed -i 's/.*abd.*/xyz/' < '$1'

sed -i 's/.*abd.*/xyz/' $1

腳本

./sed_script.sh input.txt

要重現您的錯誤,必須使用長度為零的文件:

$ sed -i 's/.*abd.*/xyz/' ""
sed: can't read : No such file or directory

既然你說這個命令是腳本的一部分,這讓我相信要麼

  1. 該腳本有問題,並且在呼叫時使用的變數名稱中包含拼寫錯誤sed,如
filename=$1
sed -i 's/.*abd.*/xyz/' "$fliname"    # should have been "$filename"

或者

for i in something; do
   sed -i 's/.*abd.*/xyz/' "$1"      # should have been "$i"
done
  1. 您可能錯誤地使用了腳本,例如沒有給它正確的選項或文件名參數。

至於您嘗試的修復,它們都不正確。由於您正在使用sed -i因此無法從名稱為 in 的文件的重定向中讀取標準輸入$1

最後一個變種,

sed -i 's/.*abd.*/xyz/' $1

大部分是正確的,但$1需要引用為"$1",否則將無法正確處理名稱中包含空格或萬用字元等的文件名。

非常不幸的是,當您在腳本中嘗試這些命令的變體時,您永遠不會說會發生什麼,並且您永遠不會說腳本中的錯誤命令實際上是什麼樣子(或者腳本的其餘部分實際上做了什麼),這是非常不幸的。這將使調試問題更容易。

請注意,這裡上面的命令(修正$1$1sed.

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