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



我有这个样本文件

{
    {
        doSomething();
    }

}

我正在努力实现的是:

{
    {
        doSomething();
    }
}

我试着做这个

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

但无济于事。

我想去掉右括号之间的换行符。

注意:我已经读过这篇文章了。如何使用sed替换换行符?我也知道N命令,但我无法创建一个有效的sed表达式来实现我想要实现的目标。

使用sed:

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

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

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

它的工作原理

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

    这是一个sed习惯用法,它将整个文件读入模式空间。(如果您的文件很大,我们会考虑其他解决方案。)

  • s/}nn*}/}n}/g

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

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

使用awk:

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

你到底想做什么还不清楚。但是,如果你想使用多行regexp,你应该知道,在它的经典形式中,sed不打算一次处理多行(可能已经出现了一些sed的多行版本)。您可以使用其他工具,如perl。当我需要它时,我通常会做以下工作流程:

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

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

相关内容

  • 没有找到相关文章

最新更新