「|」アイテムを変えたいです。とは別にファイルの各行に最後のスペースを入れるには、次のようにします。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