ファイルに提供されるテキストは次のとおりです。
oldValue
=null*
persistedObjectId
="STRAN-2019-10420"*
persistedObjectVersion
=0*
propertyName
="Status"*
uri
="/oms/salesOrder/saveSalesOrder"
「*」と「=」の間のすべての項目をどのように変更できますか(逆の代わりに)?使用しようとして失敗しました。
sed 's/\*\n.*\n=//g' filename.txt
答え1
問題はsed
1行ずつ動作するため、複数行のパターンが一致しないことです。 GNUを使用している場合は、sed
オプションを使用して-z
同じバッファ内のすべての行を処理できます。
sed -z 's/\*[^=]*=//g' filename.txt
コードも変更しました。欲が多いので、*
使用時に最後の行まですべての行を食べて次の行で止まるように変更しました。=
.*
[^=]*
=
optionsがない場合は、-z
ファイル全体を直接バッファに収集する必要があります。私は通常、予約済みスペース内のすべてを収集し、最後の行の予約済みスペースとパターンスペースを置き換えます。
sed 'H;1h;$!d;x;s/\*[^=]*=//g'
H
予約済みスペースに各行を追加します。1h
ファイルの先頭に改行文字を追加したくない場合は、予約済みスペースを現在の行で上書きします。$!d
最後の行を除くすべての行を削除し、その行の追加処理を停止します。x
以下は最後の行に対してのみ実行され、2つのスペースを交換するため、予約済みスペースに集まったファイル全体がパターンスペースになります。