首页 > 解决方案 > 用空行替换文件中的 $Header$ 格式

问题描述

我有一个 bash 脚本,我正在尝试编写以删除带有空行的 $ Header $ 模式

像下面这样的行需要用空行替换

 /* $Header$ */
 /*$Header$*/
 /* $Header$ This is a test*/

我的脚本如下,但在寻找匹配时我得到了意外的 EOF。如何解决这个问题?

#!/bin/bash
for f in *.java;
do
 echo "Processing $f file ..." ;
 sed -i "s/\$Header\$//g' $f
done

执行 2

根据评论,我修改了以下脚本并执行了以下内容,但它只替换了 $Header$,它仍然留下了 /* */ 。如果行中的模式匹配,有没有办法可以用空行替换整行?

#!/bin/bash
for f in *.java;
do
 echo "Processing $f file ..." ;
 sed -i 's/\$Header\$//g' "$f"
done

标签: bash

解决方案


你的尝试有很多问题。

  • 不平衡的引号是语法错误。
  • 您的正则表达式仅针对$Header$字符串,而不是整行。
  • 可能不需要在显式循环中运行它。

尝试这个:

sed -i 's%^[ \t]*/\*\([^*]*\|\*[^/]\)*\$Header\$\([^*]*\|\*[^/]\)*\*/[ \t]*$%%' *.java

如果您sed不识别\t为选项卡,\t请用文字选项卡替换(如果您在提示符下尝试此操作,ctrl-v tab将在许多 shell 中插入文字选项卡)。1

这个正则表达式非常复杂。它寻找

  • ^- 行首
  • [ \t]*- 任意数量的前导空格
  • /\*- 评论的文字开始
  • \([^*]*\|\*[^/]\)*- 任何不是评论关闭序列的东西(所以任何不是的东西*,或者一个文字*后面跟着不是的东西/,重复零次或多次)
  • \$Header\$- 文字字符串$Header$,其中美元符号必须为正则表达式转义
  • ...再次,不是评论终止符的序列
  • \*/- 后跟注释终止符
  • [ \t]*- 之前有任意数量的尾随空格
  • $- 行结束

在 MacOS 和其他基于 *BSD 的平台上,您需要sed -i ''为选项提供一个空的非可选参数-i。如果平台可移植性很重要,那么切换到 Perl 可能是最简单的前进路线(奇怪的是),并且可以简化正则表达式。

在字符串中而不是在注释中包含 CVS 关键字的情况并不少见$Header$,但我假设这超出了这个问题的范围。(如果你真的需要扩展它,找到一个现有的问题可能不是不可能的。)也许你还想捕获类似的表达式$Header: moo bar baz$?更新正则表达式来做到这一点应该不难。


1要了解您的sed支持\t,请尝试以下操作:

printf '*\t*\n' | sed 's/\t/yes/'

如果你看到*yes*你很好。


推荐阅读