![如何从文件中删除所有注释?](https://linux22.com/image/56324/%E5%A6%82%E4%BD%95%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%A0%E9%99%A4%E6%89%80%E6%9C%89%E6%B3%A8%E9%87%8A%EF%BC%9F.png)
我有一个包含评论的文件:
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
我想打印该文件而不包含任何注释:
foo
bar
stuff
morestuff
evenmorestuff
在很多应用程序中这都会有所帮助。有什么好的方法呢?
答案1
删除所有注释的一种方法是使用grep
with-o
选项:
grep -o '^[^#]*' file
在哪里
-o
:仅打印匹配的部分线的- 第一个
^
:行的开头 [^#]*
#
:除了重复零次或多次之外的任何字符
请注意,空行也将被删除,但只有空格的行将保留。
答案2
我相信sed
在这方面可以做得比grep
.像这样的东西:
sed '/^[[:blank:]]*#/d;s/#.*//' your_file
解释
sed
默认情况下,将逐行查看文件并在可能应用引号中的转换后打印每一行。 (sed '' your_file
将只打印所有行不变)。- 在这里,我们给出了
sed
在每一行上执行的两个命令(它们用分号分隔)。 - 第一个命令说:
/^[[:blank:]]*#/d
。在英语中,这意味着如果该行在其开头匹配哈希(前面有任意数量的前导空格),则删除该行(不会打印)。 - 第二个命令是:
s/#.*//
。也就是说,在英语中,将散列标记后跟尽可能多的内容(即直到行尾)替换为任何内容(没有内容是最后两个之间的空白//
)。 - 总之,这将贯穿您的文件,删除完全由注释组成的行,并且此后留下的任何行都将删除其中的注释。
答案3
正如其他人指出的那样,如果脚本的任何部分看起来像注释但实际上不是注释,则 sed 和其他基于文本的工具将无法正常工作。例如,您可以在字符串中找到#,或者相当常见的$#
and ${#param}
。
我写了一个名为的 shell 格式化程序转移,它具有缩小代码的功能。其中包括删除评论等:
$ cat foo.sh
echo $# # inline comment
# lone comment
echo '# this is not a comment'
[mvdan@carbon:12] [0] [/home/mvdan]
$ shfmt -mn foo.sh
echo $#
echo '# this is not a comment'
解析器和打印机是 Go 包,因此如果您想要自定义解决方案,那么编写一个 20 行 Go 程序来按照您想要的方式删除注释应该相当容易。
答案4
您可以使用 sed 命令获得所需的输出。下面的命令对我来说已经成功了。
sed 's/#.*$//g' FileName
在哪里
#.*$
#
- 正则表达式将过滤从开头到行尾的所有字符串
这里我们需要删除这些行,因此我们用空替换,因此跳过“替换”部分。
g
- 提到重复搜索模式直到到达文件末尾。
sed的一般语法:s/regexp/replacement/flags FileName