![( sed 指令)-> sed $foo](https://rvso.com/image/111991/%EF%BC%88%20sed%20%E6%8C%87%E4%BB%A4%EF%BC%89-%3E%20sed%20%24foo%20.png)
我正在編寫一個腳本,該腳本使用 sed 命令來替換文件中的特定標識符。目前該腳本已對 sed 指令進行硬編碼
目前方法:
s*ed 's/@Number@/ ' "${Number}" '/g; s/@Value@/ ' "${Value}" '/g;
s/@Socket@/ ' "${Socket}" '/g' File_Template > index.html*
由於 sed 命令將不再被硬編碼,並且我們正在運行許多具有不同 sed 要求的進程,我想做這樣的事情
目標:
INITIALIZE_SED_COMMAND='s/@Number@/ ' "${Number}" '/g;
s/@Value@/ ' "${Value}" '/g;
s/@Socket@/ ' "${Socket}" '/g;'
# Some logic happens here
INITIALIZE_SED_COMMAND="$INITIALIZE_SED_COMMAND File_Template > index.html" ;
sed $INITIALIZE_SED_COMMAND
這可以作為腳本在 Linux 平台上運行,.sh
但我需要在 .ksh unix
我一直無法解析。
錯誤:
sed:無法找到或開啟檔案 s/@Number@/npdsfg/g;。
sed:無法找到或開啟檔案 s/@Value@/SQR。
sed:無法找到或開啟檔案#s/@Socket/semi_/g;。
答案1
這不是從基於 Linux 的系統遷移到某些非基於 Linux 的系統(也許是 AIX?)的結果。這是對 shell 如何解析和執行命令的根本誤解。
您不能編寫此程式碼並期望它將時間戳寫入檔案:
v="date > /tmp/date.txt"
$v
同樣,您不能編寫此程式碼並讓它執行替換並將結果寫入輸出文件
v="s/abc/XYZ/ /tmp/source > /tmp/destination"
sed $v
不能在變數內指定檔案重定向。
我認為您正在尋找的是sed -f
,您可以在其中建立替換檔案並將它們應用於來源資料檔案:
#!/bin/ksh
# Usage: thisprogram <transform_file> <src_file> <dst_file>
#
transform="$1"
src="$1"
dst="$2"
sed -f "$transform" "$src" >"$dst"
轉換檔案可能包含以下操作:
s/@Number@/1234/g
s/@Value@/somevalue/g
s/@Socket@/99b44/g
顯然,您必須在特定執行的上下文中準備此內容。
透過您的問題的更多詳細信息,可能可以進一步採用此解決方案,但我相信您在這裡有足夠的資訊來針對您的特定用例重新設計它。