だから...質問:

だから...質問:

私はここでこの質問をするハンマーポケットと同じくらい愚かな感じですが、長い一日が過ぎ、ここで何が間違っているのかわかりません。

ファイルがありますtextfile.txt。その内容は(この代表的な例ですが操作された例では)次のとおりです。

文書内容

SOME=1
TRIED="THEIR BEST AT"
INSERTING='A VALUE'
BE=4

それでは、2つの変数があるとし、$KEYファイル$VALから更新したいキーと値を表すものがあるとしましょう。ナレーター:どちらも引用符["]またはアポストロフィ[']を含めないことを保証できます。):

新しい価値

KEY="TRIED"
VAL="THEIR HAND AT"

わかりました。今、私は沼地標準正規表現置換のように見えることをトリガしています(交換された値が何でも含めようとしていることに注意してください)。任意に選択できる現在、周囲に区切り文字があります):

sed -E "s/$KEY=([\"']?).*([\"']?)/$KEY=\1$VAL\2/g" textfile.txt > textfile.txt

予想される結果

SOME=1
TRIED="THEIR HAND AT"
INSERTING='A VALUE'
BE=4

実際の結果

 

(空のファイル)

わかりました、わかりました。私のターゲットが私が読んでいるファイルではなく新しいファイルであればどうなりますか?

sed -E "s/$KEY=([\"']?).*([\"']?)/$KEY=\1$VAL\2/g" textfile.txt > textfile2.txt

新しい結果

SOME=1
TRIED="THEIR HAND AT
INSERTING='A VALUE'
BE=4

首都!

AT...今、値の周りに2番目の区切り文字(末尾の二重引用符)がありません。再利用可能で動作します\1が、壊れやすい感じがし、ボールがどこに落ちるのかわかりません。

だから...質問:

  1. 最初の試みでファイルが完全に消去されるのはなぜですか?
  2. 2番目の区切り文字で後者の区切り文字が省略されているのはなぜですか?

私はこのアプローチがまったく好きではなく、別の道を行くかもしれませんが、誰かがこれらの2つのことを説明してくれたらとても感謝しています。昨日私に尋ねたら、RegExを知っていると誓った。シェルで使ったからです。

私はVentura 13.0の2021 MacBook M Chip ProでGNU bashバージョン5.2.12を実行しています(助けになれば)。

ベストアンサー1

-iスイッチがなく、スイッチspongeがある場合moreutils、あなたはできます:

sed 's///g' file | sponge file

このツールは、この目的のために特別に設計されています。

おすすめ記事