sed: -e 式#1 文字 48: 終了していない 's' コマンド

sed: -e 式#1 文字 48: 終了していない 's' コマンド

私のプロジェクト.shファイルに次のコマンドを書きました。

var1=`sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g;s/^/"/g;s/$/"/g' ${var}`
sed -i "s/%PQR%/$var1/g" file2

var更新したいファイルの場所を保存する変数です。ファイルの先頭と末尾に二重引用符を追加したいと思います。また、すべての新しい行を\n

To err is to human.
This is life.

出力:

"To err is to human.\nThis is life."

次に%PQR%infile2var1

ただし、パイプラインを実行すると、タイトルに記載されているように2番目のコマンドでエラーが発生します。

sed: -e expression#1 char 48: unterminated `s' command

答え1

ファイルの内容をjson文字列にエンコードするには、次のようにします。

json=$(jq --slurp -R < "$file")

または:

json=$(jq --slurp -R 'rtrimstr("\n")' < "$file")

最後の行を区切る改行文字を切り捨てます。

そして、特定のプレースホルダをランダムなデータに置き換えることははるかに使いやすいですperl-iいくつかのsed実装でサポートされているオプションは実際にインスピレーションを受けましたperl)。

PLACEHOLDER='%PQR%' REPLACEMENT="$json" perl -pi -e '
  s/\Q$ENV{PLACEHOLDER}\E/$ENV{REPLACEMENT}/g' -- "$other_file"

sedしかし可能です一部の文字をエスケープする必要があります。

関連情報