如果符合条件,则替换文件每一行中的字符 - Unix

Replace the characters in every line of a file, if it match a condition - Unix

我有一个文件 "dummy",其中: 如果文件的 15 个字符与 "R" 匹配并且文件的 28 个字符与 "D" 匹配 那么 53-56 个字符应替换为 0.

我试过使用下面的脚本,但它不起作用。

for i in `cat dummy`
do
    if [[ `echo $i | cut -c15` = "R" ]] && [[ `echo $i | cut -c28` = "D" ]]
then
   sed -e 's/./0/53' -e 's/./0/54' -e 's/./0/55' -e 's/./0/56'
fi
done

输入文件:虚拟

05196220141228R201412241308D201412200055SA1155WE130800031300SL07Y051
05196220141228R201412241308A201412220350SA0731SU1950LAX C00020202020
05196220141228R201412241308D201412200055SA1155WE130823455300SL07Y051
05196220141228N201412241308A201412240007TU0548WE1107MEL C00000000015
07054820141228N201412220850D201412180300TH1400MO085000040300UL180001

输出应该是:

05196220141228R201412241308D201412200055SA1155WE130800001300SL07Y051
05196220141228R201412241308A201412220350SA0731SU1950LAX C00020202020
05196220141228R201412241308D201412200055SA1155WE130800005300SL07Y051
05196220141228N201412241308A201412240007TU0548WE1107MEL C00000000015
07054820141228N201412220850D201412180300TH1400MO085000040300UL180001

无需使用 bash 循环遍历文件。 sed一个人就能搞定:

$ sed -r '/^.{14}R.{12}D/s/(.{52}).{4}/000/' file
05196220141228R201412241308D201412200055SA1155WE130800001300SL07Y051
05196220141228R201412241308A201412220350SA0731SU1950LAX C00020202020
05196220141228R201412241308D201412200055SA1155WE130800005300SL07Y051
05196220141228N201412241308A201412240007TU0548WE1107MEL C00000000015
07054820141228N201412220850D201412180300TH1400MO085000040300UL180001

这使用表达式 sed '/pattern/s/X/Y/' file:在匹配 pattern 的行中,将 X 替换为 Y

在这种情况下,

  • /^.{14}R.{12}D/ 行以任意 14 个字符开始,后跟 R,然后是任意 12 个字符,后跟 D.
  • (.{52}).{4} 查找任意 52 个字符后跟任意 4 个字符并将它们替换为...
  • 000 第一个块后跟 0000.