コマンドは対話型シェルでは機能しますが、スクリプト内では機能しません。

コマンドは対話型シェルでは機能しますが、スクリプト内では機能しません。

crn.txt次のテキストを含むテキストファイルがあります。

9 1 * * 3,6 /opt/testtingtools/kos/bin/cos.sh
55 23 * * * /opt/testtingtools/tqdaily.sh 2>>/opt/toolcheck/extract.err
50 11 * * 6 /opt/devtools/toolbox/toolcheck.sh >>toolcheck.log 2>&1
55 23 * * 5 /opt/devtools/toolbox/reset.sh >>/opt/toolcheck/log/reset.log
56 23 * * 6 /opt/prdtools/tqweekly.sh 2>>/opt/checktool/extract.err
30 11 * * 6 /opt/proadtools/tool.sh >/opt/checkingtools/tool.log 2>&1

出力が次のように表示されるように、単語と更新を含む行をtesttingtools削除する必要があります。crn.txt

50 11 * * 6 /opt/devtools/toolbox/toolcheck.sh >>toolcheck.log 2>&1
55 23 * * 5 /opt/devtools/toolbox/reset.sh >>/opt/toolcheck/log/reset.log
56 23 * * 6 /opt/prdtools/tqweekly.sh 2>>/opt/checktool/extract.err
30 11 * * 6 /opt/proadtools/tool.sh >/opt/checkingtools/tool.log 2>&1

私はコマンドを使用しています

sed '/testtingtools/d' crn.txt 2>&1 | tee crn.txt

Bashまたはコマンドラインから実行できますが、スクリプト内では実行できません。私はUnixサーバー(sunSolaris)を使用しています。

Linuxでは実行できますが、Unixでは実行できないコマンドもあります。

echo "$(sed '/testtingtools/d' crn.txt)" > crn.txt

「動作しない」とは、特定の行を削除しないことを意味し、スクリプト内のコードを使用するとファイル全体が消去されます。しかし、コマンドラインでコードを使用するとcrn.txt

ベストアンサー1

Solarisではsed内部編集はできません。

Linuxでは、次のものを使用できます。

sed -i '/testtingtools/d' crn.txt

Solaris および Linux で実行できる移植可能な方法は次のとおりです。

cp crn.txt crn.tmp
sed '/testtingtools/d' <crn.tmp >crn.txt &&
rm crn.tmp

発生する可能性のある問題は、teeファイルが読み取られる前にファイルが切り捨てられて空のファイルになることです。sedパイプラインのコマンドは同時に実行されます。

通常、同じコマンドから切り捨てられたファイルを読み取ることを避け、代わりに一時ファイルを使用することをお勧めします。これがsed -i後ろから起こるものです。

他のコマンドに似ています。

echo "$(sed '/testtingtools/d' crn.txt)" > crn.txt

次のように書くのが最善です。

sed '/testtingtools/d' crn.txt >crn.txt

これ最初すべての標準シェル(LinuxおよびSolaris)で発生する現象は、シェルがリダイレクトを確認し、出力ファイルを0サイズに切り捨てることです。 それからこのコマンドは、sedLinuxとSolarisの両方で期待どおりに機能しません(つまり、ソースファイルを編集したい場合)。

おすすめ記事