![( sed コマンド)-> sed $foo](https://rvso.com/image/111991/(%20sed%20%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)-%3E%20sed%20%24foo%20.png)
私はsedコマンドを使用してファイル内の特定の識別子を置き換えるスクリプトを書いています。現在、スクリプトにはsedコマンドがハードコードされています。
Ex 現在の方法:
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) に移行した結果ではありません。これは、シェルがコマンドを解析して実行する方法に関する根本的な誤解です。
次のように記述しても、ファイルにタイムスタンプが書き込まれるとは期待できません。
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
当然ながら、特定の実行のコンテキスト内でこれを準備する必要があります。
質問に詳細があれば、このソリューションをさらに進めることができるかもしれませんが、特定のユースケースに合わせて修正するのに十分な情報がここにあると信じています。