(sed コマンド) -> sed $foo [閉じる]

(sed コマンド) -> sed $foo [閉じる]

私は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、おそらく?)にマイグレーションした結果ではありません。これは、シェルがコマンドを解析して実行する方法の根本的な誤解です。

このコードを書いてファイルにタイムスタンプを書き込むことは期待できません。

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

明らかに、特定の実行の文脈でこれを準備する必要があります。

問題の詳細を含め、このソリューションをさらに適用することが可能かもしれませんが、これには特定のユースケースに合わせて再設計するのに十分な情報があると思います。

関連情報