bash - 用空行替换文件中的 $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
解决方案
你的尝试有很多问题。
- 不平衡的引号是语法错误。
- 您的正则表达式仅针对
$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*
你很好。
推荐阅读
- javascript - npm install github 给出了意外的标识符错误
- javascript - 用 event.stopPropagation() 解决问题
- javascript - 如何缩放条形图列以正确且按比例地放入其容器中?
- swift - iOS 应用上的 Readium 和 Sony URMS 集成
- java - 没有从 jsp 页面得到正确的响应
- javascript - 从另一个 javascript 推送角度图表数据
- python - 如何防止转义字符改变随机生成的 Python 字符串的输出?
- scala - 尝试与尝试 - 捕获块
- azure-service-fabric - 在开发人员机器上自动创建没有 DefaultServices 的服务
- html - 使用 itext 和飞碟从 html/css 转换为 pdf 时字体颜色发生变化