各行の最後の文字を除くすべての文字を置き換える

各行の最後の文字を除くすべての文字を置き換える

「|」アイテムを変えたいです。とは別にファイルの各行に最後のスペースを入れるには、次のようにします。sedのみ。私はこのようなことを避けたい:

 sed -e "s/[|]/ /1" -e "s/[|]/ /1" -e "s/[|]/ /1" -e "s/[|]/ /1" -e "s/[|]/ /1"  -e "s/[|]/ /1" -e "s/[|]/ /1" mydata.txt

ファイル入力:

FLD1     |SFK TK |FLD2   |FLD4 |FLD5 |-          |20200515 |NNNN |406   RCO 301
FLD1     |SFK TK |FLD2   |FLD4 |FLD5 |-          |20200515 |NNNN |0
FLD1     |SFK TK |FLD2   |FLD4 |FLD5 |-          |20200515 |NNNN |0     

ファイル出力:

FLD1      SFK TK  FLD2    FLD4  FLD5  -           20200515  NNNN |406   RCO 301
FLD1      SFK TK  FLD2    FLD4  FLD5  -           20200515  NNNN |0
FLD1      SFK TK  FLD2    FLD4  FLD5  -           20200515  NNNN |0

ベストアンサー1

sed ':a;/[|].*[|]/s/[|]/ /;ta' file
  • /[|].*[|]/:ラインにパイプが2本ある場合
  • s/[|]/ /:最初のものを空白に置き換えます。
  • ta:交換した場合に戻ります:a

出力:

$ sed ':a;/[|].*[|]/s/[|]/ /;ta' file
FLD1      SFK TK  FLD2    FLD4  FLD5  -           20200515  NNNN |406   RCO 301
FLD1      SFK TK  FLD2    FLD4  FLD5  -           20200515  NNNN |0
FLD1      SFK TK  FLD2    FLD4  FLD5  -           20200515  NNNN |0

@steeldriverが言ったように、上記のように|基本正規表現(BRE)では単純に使用できません。拡張正規表現(ERE)を有効にするフラグをsedに追加する[|]か、またはを-E作成する必要があります。[|]\|


完全性のために、POSIX sed 仕様「除外編集」と言う{...},a,b,c,i,r,t,w,:,,そして#後ろにはセミコロンがあります。これで、上記と互換性のある代替方法は次のとおりです。

sed -e ':a' -e '/[|].*[|]/s/[|]/ /;t a' file

おすすめ記事