【问题标题】:Replace the characters in every line of a file, if it match a condition - Unix如果文件匹配条件,则替换文件每一行中的字符 - Unix
【发布时间】:2015-08-18 22:23:54
【问题描述】:

我有一个“虚拟”文件,其中: 如果文件的 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

【问题讨论】:

    标签: unix replace sed match conditional-statements


    【解决方案1】:

    无需使用 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}R.{12}D/ 行以任意 14 个字符开头,后跟 R,然后是任意 12 个字符,后跟 D
    • (.{52}).{4} 查找任意 52 个字符后跟任意 4 个字符并将它们替换为...
    • \10000 第一个块,然后是0000

    【讨论】:

    • 感谢您的回复。我会试试这个命令,让你知道结果。
    • 感谢您的意见。我将尝试使用该命令并尽快让您知道结果。
    • 我可以在saction 之后使用最后一个模式(//)建议sed -r '/^\(.{14}R\).{12}D/ s//\10000/' file
    • @NeronLeVelu 感谢,但请注意要打印的块基于前 52 个字符,这与模式中的 14 个不同。
    • 哎呀你是对的,写没有正确阅读请求和回复,对不起
    猜你喜欢
    • 2022-01-13
    • 2018-02-24
    • 2021-04-15
    • 2021-05-25
    • 2021-09-30
    • 2021-03-15
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多