【问题标题】:How to replace newline for a specific line number?如何替换特定行号的换行符?
【发布时间】:2014-08-21 11:13:17
【问题描述】:

祝大家今天好,

我想知道如何在特定行号处替换换行符。

到目前为止我已经完成了:[Linenumber=11]

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

提前感谢任何线索

【问题讨论】:

    标签: bash awk sed grep


    【解决方案1】:

    好吧,如果您知道行号,那么在任何语言中都非常简单:

    $ cat file
    1
    2
    3
    4
    5
    

    使用sed:

    $ sed '3{N;s/\n//;}' file
    1
    2
    34
    5
    

    在sed 中,您可以使用数字作为表示行号的模式。我们可以将动作括在大括号内,这样它只在模式为真时发生。这里3 代表第3 行。大括号内是我们的操作,它声明N 将下一行附加到由新行分隔的模式空间。此时我们的模式空间中有line 3\nline4。我们接着进行一个简单的替换,将换行符替换为空。

    使用awk:

    $ awk 'NR==3{printf "%s", $0; next}1' file
    1
    2
    34
    5
    

    awk 还包含模式操作语句。这里我们使用NR==3 作为我们的模式。 NR 是 awk 内置变量,保存当前行号。当行号为 3 时,我们要求 awk 执行特定操作。我们的动作在大括号内。我们使用printf,它明确需要换行符。 next 允许我们移动到下一行。最后的1 是一个awk 习惯用法,它触发默认操作,即打印。对于与我们的模式不匹配的所有行,我们按原样打印它们。由于它使用print,它为我们放置了换行符。

    使用perl:

    $ perl -pe 'chomp if $.==3' file
    1
    2
    34
    5
    

    对于perl,我们使用两个选项。 -p 创建一个隐式 while(<>) { print } 循环来处理我们文件的每一行。 -e 告诉 perl 解释器执行它后面的代码。 perl 中的 $. 保存当前行号。 chomp 是一个内置函数,用于删除尾随换行符。因此,当我们的行号为 3 时,我们要求 perl 到 chomp 为我们换行。所有其他行都按原样打印。

    【讨论】:

    • 非常感谢!!!最后一个问题:问大家是怎么工作的会不会太过分了?
    【解决方案2】:

    通过 perl,

    perl -pe 's/\n// if $. == 11' file
    

    要保存所做的更改,

    perl -i -pe 's/\n// if $. == 11' file
    

    示例:

    $ cat file
    1
    2
    3
    4
    

    $ perl -pe 's/\n// if $. == 3' file
    1
    2
    34
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-29
      • 2020-11-12
      • 1970-01-01
      • 2022-06-15
      • 2023-04-10
      • 2022-01-05
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多