我有一个具有以下格式的固定宽度文件
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 开头的行,并且必须用“MMMM”替换从第 20 个位置到第 50 个位置的字符,并保留直到第 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)/"'
开头的记录,但我想处理以 开头的记录。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$(printf "%-30s" MMMM)\3 替换 \1\2\3