sedを使用して特定の数字で始まるレコードを見つけて置き換える方法

sedを使用して特定の数字で始まるレコードを見つけて置き換える方法

次の形式の固定幅ファイルがあります。

012019-06-03070005000799111160300000030XXXXXXX0700000000030  
012019-06-03070005000799165030700000030XXXXXXX0700000000030  
012019-06-03070005000799175500700000030XXXXXXX0700000000030  
022019-06-030007276384I06000000000000207000991755007000000300  
022019-06-030007276384I06000000000000107000991755007000000300  
012019-06-03070005000799175840700000030XXXXXXX0700000000030  
022019-06-030007276384I06000000000000407000991758407000000300  
022019-06-030007276384I06000000000000307000991758407000000300  
012019-06-03070005000799194080700000030XXXXXXX0700000000030  
012019-06-03070005000790035750700000030XXXXXXX0700000000030  
012019-06-03070005000790036660700000030XXXXXXX0700000000030 

02で始まる行を処理し、20番目から50番目の位置までの文字を「MMMM」に置き換えて、スペースを50番目の位置まで保持する必要があります。

私の出力は次のようになります

012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
022019-06-03000727638MMMM                          70000003
022019-06-03000727638MMMM                          70000003
012019-06-03070005000MMMM                          00000030
022019-06-03000727638MMMM                          70000003
022019-06-03000727638MMMM                          70000003
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030

試してみましたが、sed -Ee '/^02"s/((.20).{30}/\1$(printf "%-30s" MMMM)/"'andで始まるレコードを置き換えますが、andで始まるレコードを処理したいと思います。010202

答え1

この試み、

オプション1:あなたのニーズに応じて出力

sed "s/\(.\{21\}\)\(.\{30\}\)\(.\{8\}\)\(.*\)/\1$(printf "%-30s" MMMM)\3/"  file
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
022019-06-03000727638MMMM                          70000003
022019-06-03000727638MMMM                          70000003
012019-06-03070005000MMMM                          00000030
022019-06-03000727638MMMM                          70000003
022019-06-03000727638MMMM                          70000003
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
  • (.\{21\}\)最初の21文字は次の場所に保存されます。\1
  • (.\{30\}\)次の30文字は、次の文字に保存されます。\2
  • (.\{8\}\)次の8文字は次に保存されます。\3
  • (.*\)残りは次の場所に保存されます。\4
  • 次に、\1\2\3\4 を \1$(printf "%-30s" MMMM)\3 に置き換えます。

オプション2:あなたの状況に応じて

sed "/^02/ s/\(.\{19\}\)\(.\{31\}\)\(.*\)/\1$(printf "%-30s" MMMM)\3/" file
012019-06-03070005000799111160300000030XXXXXXX0700000000030  
012019-06-03070005000799165030700000030XXXXXXX0700000000030  
012019-06-03070005000799175500700000030XXXXXXX0700000000030  
022019-06-030007276MMMM                          07000000300  
022019-06-030007276MMMM                          07000000300  
012019-06-03070005000799175840700000030XXXXXXX0700000000030  
022019-06-030007276MMMM                          07000000300  
022019-06-030007276MMMM                          07000000300  
012019-06-03070005000799194080700000030XXXXXXX0700000000030  
012019-06-03070005000790035750700000030XXXXXXX0700000000030  
012019-06-03070005000790036660700000030XXXXXXX0700000000030
  • /^02/行が「02」で始まる場合にのみ置換が発生します。
  • (.\{19\}\)最初の19文字は次の場所に保存されます。\1
  • (.\{31\}\)次の31文字は次に保存されます。\2
  • (.*\)残りは次の場所に保存されます。\3
  • 次に、\1\2\3 を \1$(printf "%-30s" MMMM)\3 に置き換えます。

関連情報