【问题标题】:How do i remove linefeeds after matching string until next match in linux?如何在匹配字符串后删除换行符,直到下一次匹配在 linux 中?
【发布时间】:2015-10-15 18:59:32
【问题描述】:

您好,提前感谢您的阅读,也许可以帮助我。 我有一个类似下面示例的日志,我希望 id、时间和日期中的所有文本都在一行中,直到下一个 id、时间和日期。我已经尝试了一些示例,但还没有找到合适的示例... 这是正文。它在 latin1 中,我认为这就是为什么它看起来有点滑稽。

1334361 05:35:47 15-10-15 塔尔格鲁普:Sk�n RAPS-03 Adr : Burl�vsbadet 奥特: 欧姆:M170 Kommun : Burl�v 品牌 ute-fordon 人比尔 �vrigt 直到ggsinfo: �rende ID : 2 一个 1334361 05:36:47 15 年 10 月 15 日 Talgrupp:Sk�n RAPS-03 Adr : Burl�vsbadet 奥特: 欧姆:M170 Kommun : Burl�v 品牌 ute-fordon 人比尔 �vrigt 直到ggsinfo: �rende ID : 2 P` 0742963 09:12:14 15-10-15 电话:5738690 VG�t RAPS-32 Trafikolycka - 弗拉福登 人比尔 LV 200 奥特: 斯克夫德 说唱 32 X=6494376 Y=1395320 镍: 经营:L�g

【问题讨论】:

    标签: regex linux awk sed


    【解决方案1】:

    如果您可以访问正则表达式,类似这样
    (?m)(?:\r?\n|\r)^\s+(?=[^\S\r\n])

    编辑这个(?:\r?\n|\r)\s+(?=[^\S\r\n]) 做同样的事情。

    会导致这个

    1334361 05:35:47 15-10-15  Talgrupp : Sk�n RAPS-03 Adr : Burl�vsbadet Ort :  Omr : M170 Kommun : Burl�v Brand ute - fordon Personbil �vrigt Till�ggsinfo :  �rende Id : 2 A
    1334361 05:36:47 15-10-15  Talgrupp : Sk�n RAPS-03 Adr : Burl�vsbadet Ort :  Omr : M170 Kommun : Burl�v Brand ute - fordon Personbil �vrigt Till�ggsinfo :  �rende Id : 2 P`
    0742963 09:12:14 15-10-15  �nr : 5738690 VG�t RAPS-32 Trafikolycka - flera fordon Personbil LV 200 Ort :  Sk�vde RAPS 32 X=6494376 Y=1395320 Nyckel :  Omfattning : L�g
    

    【讨论】:

    • 谢谢!看起来很有前途。你能给我一个在 python 或 bash 中如何在文本文件上使用它的例子吗?我已经尝试了一些示例,但无法使其正常工作。我可以在论坛中以某种方式附加一个文本文件吗?
    • @StefanRydberg - 我认为您可以链接到文本文件,但不确定是否可以在此处附加一个。我真的不知道 Python,也不知道 bash 使用什么正则表达式引擎。但是,你可以试试这个(?:\r?\n|\r)\s+(?=[^\S\r\n]) 看看它是否有效。我刚刚取出了多行修饰符(?m) 和行首构造^。它做同样的事情。
    【解决方案2】:

    使用 awk:

    awk '/^[0-9]+/ && NR>1 {print ""}; END {print ""}; {$1=$1; printf "%s", $0}' file 
    

    打印没有换行符的每一行,对于以数字开头和最后一行之后的行,打印一个换行符。我添加了$1=$1,它强制 awk 使用输出字段分隔符重写该行,默认情况下是一个空格。

    1334361 05:35:47 15-10-15 Talgrupp : Sk�n RAPS-03Adr : Burl�vsbadetOrt :Omr : M170Kommun : Burl�vBrand ute - fordonPersonbil�vrigtTill�ggsinfo :�rende Id : 2A
    1334361 05:36:47 15-10-15 Talgrupp : Sk�n RAPS-03Adr : Burl�vsbadetOrt :Omr : M170Kommun : Burl�vBrand ute - fordonPersonbil�vrigtTill�ggsinfo :�rende Id : 2P`
    0742963 09:12:14 15-10-15 �nr : 5738690VG�t RAPS-32Trafikolycka - flera fordonPersonbilLV 200Ort :Sk�vdeRAPS 32X=6494376 Y=1395320Nyckel :Omfattning : L�g
    

    【讨论】:

    • 谢谢!线路中仍有很多空间,但有一些值得关注的地方。
    • 我想让空白区域消失。留一个空格。
    • 更好,但我仍然无法在我的计算机上正确使用它。文本文件在这里dropbox.com/s/3nd7ryq6xgzwn3c/extra.flt?dl=0
    【解决方案3】:

    我无法得到任何答案来做我想做的事情。所以我必须按照我的老师总是告诉我们的那样,向前迈出一小步,直到你解决它。它变成了一个最终解决它的 bash 脚本。也许其他人需要它,所以我把它贴在这里。基本的东西,但有效。

    #!/bin/bash
    # Filvariabel
    cd /medianas/html
    fil="extra.flt"
    # Tar bort tomma rader
    if [ -f ${fil} ]  
        then
        grep -v '^\s*$' $fil > $fil.test
        # Tar bort linefeed
        tr '\r\n' ' ' < $fil.test > $fil.labb
        # Tar bort alla space och ersätter med en space
        tr -s " " < $fil.labb > $fil.test
        sed 's/\ [0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\n&/g' $fil.test >     $fil.klar
        # Tar bort tmpfiler och original
        rm $fil.test
        rm $fil.labb
        [[ -f $fil ]] && rm $fil
        # Tar bort inledande blank per rad
        sed -i 's/^ *//' $fil.klar
    fi
    /home/stefan/larm/fltmap-radio2.py &> /dev/null
    

    【讨论】:

      【解决方案4】:

      这个 bashscript 对我有用。也许可以帮助别人。

      #!/bin/bash
      # Filvariabel
      cd /medianas/html
      fil="/medianas/html/extra.flt"
      logfil="/medianas/html/fltlog/extra.flt.hist"
      originalfil="/medianas/html/fltlog/extra.flt.orig"
      pocfil="/medianas/html/pocsaglog.flt"
      pocbak="/medianas/html/fltlog/pocsaglog.bak.flt"
      
      [[ -f pocsaglog.flt ]] && sed -i 's/nr :.[0-9][0-9][0-9][0-9][0-9][0-    9][0-9]//' ${pocfil}
      
      # Replace Pos: with X=
      [[ -f ${fil} ]] && sed -i 's/Pos: /X=/g' ${fil}
      # Replace ,_ followed by 7 numbers, with Y=
      [[ -f ${fil} ]] && sed -i 's/\(, \)\([0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)/ Y=\2/g' ${fil}
      # Add NN to numbers in id
      [[ -f ${fil} ]] && sed -i 's/\(Mapp Id : \)\([0-9][0-9][0-9][0-9][0-    9][0-9][0-9]\)/NN\2/g' ${fil} 
      [[ -f ${fil} ]] && sed -i 's/\(nr : \)\([0-9][0-9][0-9][0-9][0-9][0-  9][0-9]\)//g' ${fil}
      
      [[ -f $fil ]] && cat $fil >> $originalfil
      # Deletes empty rows
      if [ -f ${fil} ]  
      then
      grep -v '^\s*$' ${fil} > ${fil}.test
      # Delete linefeeds
      tr '\r\n' ' ' < $fil.test > $fil.labb
      # Deletes all spaces and replace with one space 
      tr -s " " < ${fil}.labb > ${fil}.test
      [[ -f ${fil}.test ]] && sed -i '/F*rlarm/d' ${fil}.test
      # Take away Änr: and seven numbers
      sed -i 's/?nr:.[0-9][0-9][0-9][0-9][0-9][0-9][0-9]//' ${fil}.test 
      # Make blank line before pocnr
      sed -i 's/\ [0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\n&/g' ${fil}.test
      # Delete tmpfiles and original
      [[ -f ${fil} ]] && rm ${fil}
      # Delete space where line starts with it. 
      sed -i 's/^ *//' ${fil}.test
      [[ -f $fil.test ]] && cat $fil.test >> $logfil
      #   [[ -f ${fil}.test ]] && rm ${fil}.test
      fi
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-17
        • 1970-01-01
        • 1970-01-01
        • 2020-03-29
        • 2021-06-02
        • 2016-10-23
        相关资源
        最近更新 更多