次の形式の固定幅ファイルがあります。
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で始まるレコードを処理したいと思います。01
02
02
答え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 に置き換えます。