Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用sed替换字符之间的多个换行符(\n)?_Regex_Bash_Unix_Sed_Newline - Fatal编程技术网

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

Regex 如何使用sed替换字符之间的多个换行符(\n)?,regex,bash,unix,sed,newline,Regex,Bash,Unix,Sed,Newline,我有这个样本文件 { { doSomething(); } } 我努力实现的目标是: { { doSomething(); } } 我试过这么做 sed-r-i-e的/}\n+}/}\n}/g'file.txt 但是没有用 我想删除右括号之间的换行符 注意:我已经读过这篇文章,并且我也知道N命令,但是我无法创建一个有效的sed表达式来实现我试图实现的目标。不清楚您到底想要做什么。但是,如果您想使用多行regexp,您应该知道

我有这个样本文件

{
    {
        doSomething();
    }


}
我努力实现的目标是:

{
    {
        doSomething();
    }
}
我试过这么做

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

但是没有用

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


注意:我已经读过这篇文章,并且我也知道N命令,但是我无法创建一个有效的sed表达式来实现我试图实现的目标。

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

tr '\n' 'µ' < myfile.txt | sed -e 's/µ}µ/}/' | tr 'µ' '\n'
tr'\n''µ'
(因为µ字符在我的键盘上可用,并且不太可能出现在我正在使用的文件中)。最初的
tr
命令从我的文件中生成一个大行,第二个
tr
命令将换行符再次放在它们的初始位置。

使用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;$!Dx

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

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

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

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

    • 使用awk:

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

      你为什么删除了
      doSomething()
      ?@anubhava我正试图删除结尾之间的换行符parethesis@User112638726哦,对不起。编辑帖子:)@Mico你想删除所有空行吗?为什么选择希腊小写字母“mu”?(是否足够独特?)正如我所说,这个字符很容易在我的键盘上键入,并且不会出现在我的文档中;当然,任何人都可以根据自己的需要使用最相关的角色。