Linux
Bash:使用文件輸入執行 sed 操作
我正在嘗試在帶有文件作為輸入的 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
既然你說這個命令是腳本的一部分,這讓我相信要麼
- 該腳本有問題,並且在呼叫時使用的變數名稱中包含拼寫錯誤
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
- 您可能錯誤地使用了腳本,例如沒有給它正確的選項或文件名參數。
至於您嘗試的修復,它們都不正確。由於您正在使用
sed -i
,因此無法從名稱為 in 的文件的重定向中讀取標準輸入$1
。最後一個變種,
sed -i 's/.*abd.*/xyz/' $1
大部分是正確的,但
$1
需要引用為"$1"
,否則將無法正確處理名稱中包含空格或萬用字元等的文件名。非常不幸的是,當您在腳本中嘗試這些命令的變體時,您永遠不會說會發生什麼,並且您永遠不會說腳本中的錯誤命令實際上是什麼樣子(或者腳本的其餘部分實際上做了什麼),這是非常不幸的。這將使調試問題更容易。
請注意,這裡上面的命令(修正
$1
了$1
在sed
.