如何使用sed替换字符之间的多个换行符(\ n)?

时间:2015-06-29 07:04:58

标签: regex bash unix sed newline

我有这个示例文件

{
    {
        doSomething();
    }


}

我想要实现的目标是:

{
    {
        doSomething();
    }
}

我试过这个

  

sed -r -i -e's /} \ n +} /} \ n} / g'file.txt

但无济于事。

我想删除右括号之间的换行符。

注意:我已经阅读了这个How can I replace a newline (\n) using sed?并且我也知道N命令,但是我无法创建一个有效的sed表达式来实现我想要实现的目标。

3 个答案:

答案 0 :(得分:1)

使用sed:

$ sed 'H;1h;$!d;x; s/}\n\n*}/}\n}/g' file
{
    {
        doSomething();
    }
}

如果要更改文件,请使用-i开关:

sed -i 'H;1h;$!d;x; s/}\n\n*}/}\n}/g' file  # GNU sed

sed -i '' -e 'H;1h;$!d;x; s/}\n\n*}/}\n}/g' file  # BSD sed

如何运作

  • H;1h;$!d;x;

    这是一个sed成语,它将整个文件读入模式空间。 (如果您的文件很大,我们希望查看其他解决方案。)

  • s/}\n\n*}/}\n}/g

    这只是您的替换命令,只有一处更改:\n+更改为\n\n*。这是因为+不是基本正则表达式下的活动字符。如果我们使用扩展正则表达式,则大括号{}将成为活动字符,这可能导致此输入的其他问题。

    请注意,仅当第二个右括号}出现在一行的开头时,才会删除额外的换行符。

答案 1 :(得分:1)

使用awk:

awk -v RS='}' -v 'ORS=}' '!/{/{gsub(/\n+/,"\n")};1' file-name | head -n -1

答案 2 :(得分:0)

你打算做什么并不明显。但是,如果你想使用多行正则表达式,你应该知道,在它的经典形式中,sed不是一次只能在多行上运行(可能有一些多线版本的sed已经出现)。您可以使用其他工具,如perl。我需要时通常会执行以下工作流程:

tr '\n' 'µ' < myfile.txt | sed -e 's/µ}µ/}/' | tr 'µ' '\n'

(因为μ字符在我的键盘上可用,并且最不可能出现在我正在使用的文件中)。初始tr命令从我的文件中生成一个大行,第二个tr命令将换行符再次放在其初始位置。