如何从文件中删除所有注释?

如何从文件中删除所有注释?

我有一个包含评论的文件:

foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this

我想打印该文件而不包含任何注释:

foo
bar
stuff
morestuff
evenmorestuff

在很多应用程序中这都会有所帮助。有什么好的方法呢?

答案1

删除所有注释的一种方法是使用grepwith-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

相关内容