如何使用 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 开头的行,并且必须用“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)/"'开头的记录,但我想处理以 开头的记录。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$(printf "%-30s" MMMM)\3 替换 \1\2\3

相关内容