如果文件的每一行都符合条件,请替换其中的字符-Unix
我有一个文件“dummy”,其中: 如果文件的15个字符与“R”匹配,文件的28个字符与“D”匹配 则53-56个字符应替换为0 我试过使用下面的脚本,但它不起作用如果文件的每一行都符合条件,请替换其中的字符-Unix,unix,replace,sed,match,conditional-statements,Unix,Replace,Sed,Match,Conditional Statements,我有一个文件“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
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
输入文件:dummy
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}/\10000/' file
05196220141228R201412241308D201412200055SA1155WE130800001300SL07Y051
05196220141228R201412241308A201412220350SA0731SU1950LAX C00020202020
05196220141228R201412241308D201412200055SA1155WE130800005300SL07Y051
05196220141228N201412241308A201412240007TU0548WE1107MEL C00000000015
07054820141228N201412220850D201412180300TH1400MO085000040300UL180001
这使用了表达式sed'/pattern/s/X/Y/“file
:在匹配pattern
的行中,将X
替换为Y
在这种情况下,
行以任意14个字符开头,后跟/^.{14}R.{12}D/
,然后以任意12个字符开头,后跟R
D
查找后跟任何4个字符的任何52个字符,并将其替换为(.{52})。{4}
第一个块,后跟\10000
0000
- 无需使用bash循环遍历文件<代码>sed可以单独处理:
$ sed -r '/^.{14}R.{12}D/s/(.{52}).{4}/\10000/' file
05196220141228R201412241308D201412200055SA1155WE130800001300SL07Y051
05196220141228R201412241308A201412220350SA0731SU1950LAX C00020202020
05196220141228R201412241308D201412200055SA1155WE130800005300SL07Y051
05196220141228N201412241308A201412240007TU0548WE1107MEL C00000000015
07054820141228N201412220850D201412180300TH1400MO085000040300UL180001
这使用了表达式sed'/pattern/s/X/Y/“file
:在匹配pattern
的行中,将X
替换为Y
在这种情况下,
行以任意14个字符开头,后跟/^.{14}R.{12}D/
,然后以任意12个字符开头,后跟R
D
查找后跟任何4个字符的任何52个字符,并将其替换为(.{52})。{4}
第一个块,后跟\10000
0000
- 无需使用bash循环遍历文件<代码>sed可以单独处理:
$ sed -r '/^.{14}R.{12}D/s/(.{52}).{4}/\10000/' file
05196220141228R201412241308D201412200055SA1155WE130800001300SL07Y051
05196220141228R201412241308A201412220350SA0731SU1950LAX C00020202020
05196220141228R201412241308D201412200055SA1155WE130800005300SL07Y051
05196220141228N201412241308A201412240007TU0548WE1107MEL C00000000015
07054820141228N201412220850D201412180300TH1400MO085000040300UL180001
这使用了表达式sed'/pattern/s/X/Y/“file
:在匹配pattern
的行中,将X
替换为Y
在这种情况下,
行以任意14个字符开头,后跟/^.{14}R.{12}D/
,然后以任意12个字符开头,后跟R
D
查找后跟任何4个字符的任何52个字符,并将其替换为(.{52})。{4}
第一个块,后跟\10000
0000
- 无需使用bash循环遍历文件<代码>sed可以单独处理:
$ sed -r '/^.{14}R.{12}D/s/(.{52}).{4}/\10000/' file
05196220141228R201412241308D201412200055SA1155WE130800001300SL07Y051
05196220141228R201412241308A201412220350SA0731SU1950LAX C00020202020
05196220141228R201412241308D201412200055SA1155WE130800005300SL07Y051
05196220141228N201412241308A201412240007TU0548WE1107MEL C00000000015
07054820141228N201412220850D201412180300TH1400MO085000040300UL180001
这使用了表达式sed'/pattern/s/X/Y/“file
:在匹配pattern
的行中,将X
替换为Y
在这种情况下,
行以任意14个字符开头,后跟/^.{14}R.{12}D/
,然后以任意12个字符开头,后跟R
D
查找后跟任何4个字符的任何52个字符,并将其替换为(.{52})。{4}
第一个块,后跟\10000
0000
s
中使用最后一个模式(/
)建议sed-r'/^\(.14}r\)。{12}D/s/\10000/'文件
action@NeronLeVelu谢谢,但请注意,要打印回的块基于前52个字符,这与模式中的14不一样。哦,你是对的,在没有正确阅读请求和回复的情况下写作,很抱歉,谢谢你的回复。我将尝试此命令并让您知道结果。谢谢您的输入。我将尝试使用该命令,并很快告诉您结果。我可以在下面的s
中使用最后一个模式(/
)建议sed-r'/^\(.14}r\)。{12}D/s/\10000/'文件
action@NeronLeVelu谢谢,但请注意,要打印回的块基于前52个字符,这与模式中的14不一样。哦,你是对的,在没有正确阅读请求和回复的情况下写作,很抱歉,谢谢你的回复。我将尝试此命令并让您知道结果。谢谢您的输入。我将尝试使用该命令,并很快告诉您结果。我可以在下面的s
中使用最后一个模式(/
)建议sed-r'/^\(.14}r\)。{12}D/s/\10000/'文件
action@NeronLeVelu谢谢,但请注意,要打印回的块基于前52个字符,这与模式中的14不一样。哦,你是对的,在没有正确阅读请求和回复的情况下写作,很抱歉,谢谢你的回复。我将尝试此命令并让您知道结果。谢谢您的输入。我将尝试使用该命令,并很快告诉您结果。我可以在下面的s
中使用最后一个模式(/
)建议sed-r'/^\(.14}r\)。{12}D/s/\10000/'文件
action@NeronLeVelu谢谢,但请注意,要打印回的块基于前52个字符,这与模式中的14不一样。哦,你是对的,写的时候没有正确阅读请求和回复,对不起