sed データをファイルにリダイレクトする [重複]

sed データをファイルにリダイレクトする [重複]

>>>ファイルで ""を ""に置き換えようとしています。

cat table_files.md | egrep ">>>$"                               
  \>>>
  \>>>
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>

sedと交換してください

cat table_files.md | sed "s\>>>$\\g" > table_files.md

残念ながら、すべてのデータが消え、空のファイルが返されました。-i内部オプションを使用して、これを行う必要があることを確認しました。

どうすればこれが起こりますか?データを回復できますか?

ベストアンサー1

ファイルを上書きまたは切り捨てる理由は、そのファイルがあなたのファイルであるためです。シェルリダイレクトを解釈し、コマンドが実行される前にこの解釈を実行します。シェル操作の重要な部分は、さまざまなもの間の標準入力と標準出力を接続するパイプを処理することです。次のコマンドラインを実行しました。

$ command1 < somefile | command2 > somefile

実行する前に、command2シェルはコマンドの出力をファイルとして指定するリダイレクトを解釈してファイルを切り捨てます。ファイルが切り捨てられた後はcommand1読み取る入力がないため、ファイルcommand2にリダイレクトするデータをエクスポートせずにファイルが終了するパイプを閉じて終了します。

2つの質問があるようです。

1.上書きされたファイルを回復できますか?

おそらくそうではありません。可能であれば、バックアップを復元してこれを実行できます。ファイルを別のデータで上書きすると、通常ファイルの以前のバージョンが削除されます。

2. ファイルのデータを変更する最良の方法は何ですか?

推測できるように、これを行う最良の方法は次のとおりです。sed(in-place)オプションが使用されます-i。覚えて、これではない本物所定の位置で編集してください。この-iオプションを使用すると、sed はすべての入力を読み取り、変更して一時ストアに保存し、完了するとすべてを一時ストアから元のファイルに戻します。

BSD sed(macOSを含む):

sed -i '' 's:>>>$::' $filename

ただし、GNU sed(ほとんどのLinuxディストリビューション)では、指定されていないoptarg toは-inullと見なされます。

sed -i -e 's:>>>$::' $filename

>>>これにより、行の終わりが削除されます。 1行内の文字列を削除するには、行の末尾に固定されないように正規表現を変更し()、行ごとに複数の文字列に適用する$フラグを追加します。g

sed -i '' 's:>>>::g' $filename

オペレーティングシステムによって、sedは異なる方法で実行されます。共有したいツールを作成するときは、誰もが同じオペレーティングシステムを実行しているわけではないことを覚えておくことが重要です。携帯性が重要です。移植性を高めるには、サポートするすべてのプラットフォームで利用可能な機能の「最小共通分母」を使用するようにスクリプトを簡素化する必要があります。したがって:

tmpfile=$(mktemp /tmp/$$XXXX)
sed -e 's:>>>$::' $filename > $tmpfile &&
mv $tmpfile "$filename"

おすすめ記事