【问题标题】:sed remove characters between two strings on different lines [duplicate]sed删除不同行上两个字符串之间的字符[重复]
【发布时间】:2017-03-02 15:20:54
【问题描述】:

我想删除文件中字符串/**/ 之间的所有文本,其中字符串可能出现在不同的行并围绕注释。例如我想删除/**/之间的以下七行:

/* "CyIHTAlgorithm.pyx":81
 * @cython.wraparound(False)
 * @cython.cdivision(True)
 * cdef inline object IHTReconstruction2D(fType_t[:,:] data,             # <<<<<<<<<<<<<<
 *                         fType_t[:,:] residualFID,
 *                         fType_t[:,:] CS_spectrum,
 */

我已经设法使用 sed 做到这一点,其中字符串出现在同一行: sed -i.bak 's/\(\/\*\).*\(\*\/\)/\1\2/' test.txt 但我不确定如何将其扩展到同一文件中的多行:

我也试过: sed -i.bak '/\/\*/{:a;N;/\*\//!ba;s/.*\/\*\|\*\/.*//g}' test.txt 遵循这里的想法 (Extract text between two strings on different lines)

这会删除开头的/**/,但不会删除中间的文本。

【问题讨论】:

  • 查看您的 sed 版本是否有 -z 选项,这将允许 NUL 成为行分隔符而不是换行符...
  • 如果您知道在您的评论开始或结束的同一行上永远不会有非评论代码,这并不难,但对于一般情况,这更痛苦。

标签: linux bash sed


【解决方案1】:

为什么不使用 sed 范围?

$ cat tmp/file13
first line
/* "CyIHTAlgorithm.pyx":81
 * @cython.wraparound(False)
 * @cython.cdivision(True)
 * cdef inline object IHTReconstruction2D(fType_t[:,:] data,             # <<<<<<<<<<<<<<
 *                         fType_t[:,:] residualFID,
 *                         fType_t[:,:] CS_spectrum,
 */
before last line
last line

$ sed '/\/\*/,/\*\//d' tmp/file13
first line
before last line
last line

【讨论】:

    【解决方案2】:

    您可以使用 sed 或 cut,但它们实际上是为模式设计的,因此每一行都应该匹配它。 你应该通过获取开始和结束的木材线来声明第一行和最后一行,然后你可以将它包装成一个函数。

    所以, 1) 获取 /* 部分的行号 2) 获取 */ 的最后一行号 3)你可以使用“while read line;”使用 cut 或 sed 循环并剪切中间的每一行。

    【讨论】:

      【解决方案3】:

      awk 真的更适合这种事情。 supports 使用 /pattern/,/pattern2/ 语法开箱即用。

      awk '/[:space:]*\/\*/,/[:space:]*\*\// {next} {print}' file.txt

      它的工作方式如下:对于两个模式之间的行,它执行 {next} 实际上跳过该行,对于其他所有内容,它只是打印输入。

      【讨论】:

      • 这给了我一个语法错误。你能解释一下这里的语法是如何工作的吗?
      • 初始命令中的else 语句实际上存在错误。现在应该没问题了。
      【解决方案4】:

      下面会尝试做更多,所以先测试一下是否符合你的需求。

      cpp -P test.txt
      

      【讨论】:

        【解决方案5】:

        我在这里找到了答案:https://askubuntu.com/questions/916424/how-to-replace-text-between-two-patterns-on-different-lines

        sed -n '1h; 1!H; ${ g; s/<head>.*<\/head>/IF H = 2 THEN\n  INSERT FILE 'head.bes'\nEND/p }' myProgram.bes
        

        注意:这会将 HTML 文档中&lt;head&gt; ... &lt;/head&gt;(包括)之间的所有行替换为:

        IF H = 1 THEN
          INSERT FILE 'head.bes'
        END
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-03
          • 2011-04-14
          • 2021-11-16
          • 2021-05-26
          • 2015-11-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多