Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果文件的每一行都符合条件,请替换其中的字符-Unix_Unix_Replace_Sed_Match_Conditional Statements - Fatal编程技术网

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

如果文件的每一行都符合条件,请替换其中的字符-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

我有一个文件“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
输入文件: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}R.{12}D/
    行以任意14个字符开头,后跟
    R
    ,然后以任意12个字符开头,后跟
    D
  • (.{52})。{4}
    查找后跟任何4个字符的任何52个字符,并将其替换为
  • \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}R.{12}D/
        行以任意14个字符开头,后跟
        R
        ,然后以任意12个字符开头,后跟
        D
      • (.{52})。{4}
        查找后跟任何4个字符的任何52个字符,并将其替换为
      • \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}R.{12}D/
            行以任意14个字符开头,后跟
            R
            ,然后以任意12个字符开头,后跟
            D
          • (.{52})。{4}
            查找后跟任何4个字符的任何52个字符,并将其替换为
          • \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}R.{12}D/
                行以任意14个字符开头,后跟
                R
                ,然后以任意12个字符开头,后跟
                D
              • (.{52})。{4}
                查找后跟任何4个字符的任何52个字符,并将其替换为
              • \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不一样。哦,你是对的,写的时候没有正确阅读请求和回复,对不起