sed コマンドを正しく置き換えることができません

sed コマンドを正しく置き換えることができません

job.shスクリプトには次の文字列があります。

/home/myname/code_DEM/ > output.txt

代わりに、以下を使用したいと思います。

/home/myname/code_DEM/ > output_"$datetime".txt

ここで、 $datetime は日付と時刻を自動的にロードする文字列です。

これを行うには、sedコマンドを使用してみました。

sed -i 's/"$LINEout"/"$LINEnew"/' job.sh

$LINEout置き換えたい古い文字列はどこにあり、$LINEnew新しい文字列(日付と時間がある文字列)はどこにありますか?

これまで私は私が欲しいものを手に入れなかったし、何も変わらなかった。

PS:LinuxとMacOで動作するソリューションがあれば良いでしょう。 sedコマンドの構文は、LinuxごとにMacで少し異なると思います。 :)

答え1

この試み:

sed -i "s|$LINEout|$LINEnew|" job.sh

macOSでバックアップを指定する必要がある場合は、次のものを使用する必要があります。

sed -i "" "s|$LINEout|$LINEnew|" job.sh

例:

echo "foo
bar" > sample
cat sample 
foo
bar

rep=bar
sed -i.bak "s|$rep|baz|" sample
cat sample
foo
baz
cat sample.bak 
foo
bar

macOS X 10.11.6とBSD sedでテスト済み

答え2

BSD(Apple OS / Xなど)はsed -i '' ...バックアップなしで内部編集を使用しますが、GNUは他sed -i ...のほとんどのシステムでsed内部編集をサポートしません。

perl両方のオプションから取得します-i。したがって、移植性のために戻すと、perl変数の特殊文字の問題も解決されます。

A=$LINEout B=$LINEnew perl -i -pe 's/\Q$ENV{A}\E/$ENV{B}/g' job.sh

答え3

よく見つけました。クリックしてくれた@maulinglawnsに感謝します。)実際には、次のように区切り文字を変更する必要があります。

sed -i "s:$LINEout:$LINEnew:" job.sh

関連情報