【问题标题】:Concatenating every other line with the next将每隔一行与下一行连接起来
【发布时间】:2012-02-17 17:23:39
【问题描述】:

在文本文档中,我想将每隔一行与下一行连接起来。我想 sed 是要使用的东西?这将如何实现?

【问题讨论】:

标签: shell sed


【解决方案1】:

这可能对你有用:

seq 10 | sed '$!N;s/\n/ /'
1 2
3 4
5 6
7 8
9 10

$! 如果不是最后一行,
N; 将以下行追加到当前行,
s/\n/ / 用空格替换第一个(第一行的)换行符。

【讨论】:

  • 如果输入行数为奇数,请注意最后一行! seq 11 | sed '$!N;s/\n/ /'
  • @Johnsyweb 使用 GNU sed 可以满足这一要求,但我已经修改了其他 sed 的解决方案。
  • 提示:在我的例子中,文件是在 Windows 下创建的,所以我需要这样做(注意额外的 \r): sed '$!N;s/\r\n/ /'
  • 有人能解释一下吗?如果没有解释,我不知道如何学习如何针对不同的用例修改此语句。
【解决方案2】:

“在文本文档中”是什么意思?如果你用 vim 编辑文件,你可以这样做:

:g/./正常 J

【讨论】:

    【解决方案3】:

    简单的awk解决方案:

    awk '{getline b;printf("%s %s\n",$0,b)}' file
    

    测试:

    [jaypal:~/Temp] seq 11 > file
    [jaypal:~/Temp] awk '{getline b;printf("%s %s\n",$0,b)}' file
    1 2
    3 4
    5 6
    7 8
    9 10
    11 
    

    【讨论】:

      【解决方案4】:

      这是使用paste 最简单的方法:

      paste -s -d' \n' input.txt 
      

      虽然有一个 Famous Sed One-Liner (38) 来模拟 potong's answer

      【讨论】:

        【解决方案5】:

        除非您真的坚持需要 sed,否则只需通过管道传输

        paste -d" " - -

        【讨论】:

        • 不错! POSIX example ls | paste - - - - 暗示这是 POSIX,尽管我找不到明确说明的备注。请注意,对于文件,paste a a 复制了两次,可能是因为创建了两个文件描述符,而一个描述符用于标准输入。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        • 2017-09-10
        • 2023-02-08
        相关资源
        最近更新 更多