【问题标题】:remove newline between two string with sed command in unix shellscript在 unix shell 脚本中使用 sed 命令删除两个字符串之间的换行符
【发布时间】:2011-02-22 00:14:24
【问题描述】:

我有一个文件(test.dat),其中包含这样的数据

459|199811047|a |b |shan
kar|ooty|
460|199811047|a |b |guru|cbe|

但我需要它:

459|199811047|a |b |shankar|ooty|
460|199811047|a |b |guru|cbe|

从该文件中读取数据时,我不想从每条记录的末尾删除换行符。我只想删除管道符号内两个字符串 (like:shankar) 之间的 \n。

实际上在 unix 中我的 dat 文件...由 500 个字符组成..所以前 300 个字符出现在第一行,下一个 200 个字符出现中断(换行)...但是 500 应该被视为单行..所以我试图附加由于换行而中断的字符。

【问题讨论】:

  • 最后一段清晰如泥。文件总共有 500 个字符,其中只有两行吗?或者它是否包含许多长达 500 个字符的行,但长度超过 300 个字符的行已通过在第 300 个字符后插入换行符而被破坏?提到的管道符号是否仍然相关?你怎么知道线路何时被肢解了?请学习使用 shift 键并写完整的英文单词 - 'bec' 不是可接受的缩写。
  • test.dat 文件由多行组成,每行正好是 500 个字符。当该行到达第 300 个字符时,它已通过插入换行符和下一行中出现的下一个 200 个字符被破坏。仅与此相关的管道符号,这里我使用管道作为分隔符..

标签: unix sed


【解决方案1】:

灵感来自How can I replace a newline (\n) using sed?

sed ':a;N;/|$/!ba;s/\n//g'

解释(与灵感的区别):

  1. 如果遇到不以'|'结尾的行,跳转到创建的寄存器/|$/!ba

【讨论】:

    【解决方案2】:

    目前还不清楚连接两条线的标准是什么。但是,这可能会对显示的数据起到作用:

    sed -e '/|shan$/N;s/|shan\nkar|/|shankar|/' test.dat
    

    在 MacOS X 10.6.6 上使用 sed 测试。

    如果标准是“如果该行不以管道结尾,则将其与下一行连接”,则此方法有效:

    sed -e '/[^|]$/{N;s/\n//;}' test.dat
    

    搜索显示“如果该行不以管道结尾”; '{' 开始一组操作; N 将下一行与中间的换行连接起来; s/\n// 删除换行符; '}' 结束这组操作。

    【讨论】:

    • 嗨乔纳森,我有一个文件,其中包含这样的数据 459,|1998-11-047|a |b |c \n efg | d|e | \N 459,|1998-11-047|a \n c|b |c \n efg | d|e | \N 基本上我要做的是,我必须删除两个管道( | )之间即将到来(封闭)的所有 \n .. 我不想删除 \N... 只是为了让我把它放进去\n 和 \N... 我需要删除位于管道内的任何字符串之间的 \n...
    • @jcrshankar:正如您刚刚发现的,cmets 不保留换行符。用额外的例子澄清你的问题。我不清楚“两个管道之间”的标准是什么。我怀疑@Raymond 的说法是正确的;不以管道结尾的行需要连接到下一行,并删除换行符(而不是用空白替换)。
    • 嗨乔纳森,实际上在 unix 我的 dat 文件中......由 500 个字符组成..所以前 300 个字符出现在第一行,接下来的 200 个字符出现中断(换行符)...... . 但是 500 应该被当作单行来对待.. 所以我试图附加有换行符的字符
    • @jcrshankar:修复破坏数据的过程。如果您绝对无法更改 mutator,那么您需要提出问题,清楚地解释问题所在。您无需描述您认为应该如何修复它;你只是描述结果应该是什么。到目前为止,您已经两次更改了要求。见How to ask questions the smart way。
    • 现在我想我的问题可能很清楚了。对不起,负担过重
    【解决方案3】:
    awk 'ORS=/^[0-9]/?"\0":"\n"' file
    
    ruby -ne 'print /^\d+/?"#{$_.chomp}":"#{$_}";' file
    

    【讨论】:

      【解决方案4】:

      稍微不同的方法:

      sed '/^.\{300\}$/{N;s/\n//}' inputfile
      

      如果一行正好包含 300 个字符,则追加下一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-29
        • 2022-10-24
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        • 2015-11-10
        • 2021-11-16
        • 1970-01-01
        相关资源
        最近更新 更多