我正在尝试使用正则表达式创建 sed 命令,以便仅在没有注释的情况下替换文本文件中的某些内容,但由于我几乎不了解 sed 命令的知识,我遇到了一些麻烦。
我为问题的一小部分找到了解决方案,但有些还不够完整,或者我无法将它们放在一起。TL; DR 版本在最后可用。
让我们先确定我的最终目标
只有在没有注释的情况下,我才想在文本文件中匹配任何内容(如任何常规正则表达式(呵呵))。因为我想为多种语言做这件事,让我们只看常见的 C 注释。
因此,在这种情况下,可以以不同方式对单词或行进行注释。我们//
只有评论线路上的下一个内容,我们还有/* */
评论块。
环境
我目前正在使用仅支持 POSIX sed 的 Mac OSX,但我安装了一个我发现更好的 GNU-sed。(感谢Homebrew
. 包是gnu-sed
,命令是gsed
。)所以,如果您喜欢使用其中一种或另一种,我可以使用它们。
我在写这篇文章时假设使用了 GNU-sed。
忽略一个案例
第一个问题,如何忽略某些情况。我在这个话题中很容易地发现了这一点。
现在,这//
部分对我来说似乎很容易做,我只需要添加一个OR ( |
)条件即可将其与另一个条件连接起来。
它看起来像这样:
sed -E "/\/\/.*/! s/foo/bar/" file
Run Code Online (Sandbox Code Playgroud)
然后,如果输入文件是:
foo
42
test
//foo
//42
// foo
//something foo
foo
42
something foo
foo
Run Code Online (Sandbox Code Playgroud)
输出是:
bar
42
test
//foo
//42
// …
Run Code Online (Sandbox Code Playgroud)