如果符合条件,则替换文件每一行中的字符 - 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
.
我有一个文件 "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
.