我有一个带有注释的文件:
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
我只想打印所有未注释的代码:
foo
bar
stuff
morestuff
evenmorestuff
能够从文件中删除注释非常重要...有什么好的方法?
awk -F\# '$1!="" { print $1 ;} '
。
echo '#' # output a #
处理一条线?
我有一个带有注释的文件:
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
我只想打印所有未注释的代码:
foo
bar
stuff
morestuff
evenmorestuff
能够从文件中删除注释非常重要...有什么好的方法?
awk -F\# '$1!="" { print $1 ;} '
。
echo '#' # output a #
处理一条线?
Answers:
删除所有注释的一种方法是grep
与-o
选项一起使用:
grep -o '^[^#]*' file
哪里
-o
:仅打印行中匹配的部分^
:行的开头[^#]*
:除#
重复零次或多次外的任何字符请注意,空行也将被删除,但是只有空格的行将保留。
grep -v '^#' file > newfilewithoutcomments
somvar='I am a long complicated string ## with special characters' # and I am a comment
无法正确处理。
grep -o '^[^#].*' file
sed
解决方案只有一个空行,似乎是使用其他答案的可靠论据,除非我遗漏了什么?
grep
?如果仍然在示例输入中看到空格,请尝试更改grep
为command grep
。
我相信sed
可以做的比这更好grep
。像这样:
sed '/^[[:blank:]]*#/d;s/#.*//' your_file
说明
sed
默认情况下,将逐行查看您的文件,并在可能在引号中应用了转换之后打印每行。(sed '' your_file
只会将所有行打印不变)。sed
两条要在每行上执行的命令(它们之间用分号隔开)。/^[[:blank:]]*#/d
。用英语表示,这意味着如果该行在其开头与哈希匹配(以任意数量的前导空白开头),则删除该行(将不会打印)。s/#.*//
。在英语中,用一个井号代替后面的所有内容(直到该行的末尾),然后什么都没有(最后两个之间的空白都不是//
)。mystring="Hello I am a #hash"
将成为 mystring="Hello I am a"
crontab
仅允许全行注释,带或不带前导空格,但不允许在行末尾添加注释。逻辑更简单。在此答案中仅使用两个Sed指令中的第一个) (用于crontab注释剥离程序。)
#
(在第1列中)开头的行,有没有任何好处sed
了grep -v "^#"
?
您可以使用sed命令获得所需的输出。下面的命令为我完成了窍门。
sed 's/#.*$//g' FileName
哪里
#.*$
-正则表达式会过滤所有的字符串,以开始#
到行结束在这里,我们需要删除这些行,因此我们将其替换为空,从而跳过“替换”部分。
g
-提到重复搜索模式直到到达文件末尾。sed的一般语法: s/regexp/replacement/flags FileName
sed
命令的脚本...
print "#tag" # Print a hashtag.
正如其他人指出的那样,如果脚本的任何部分看起来像注释,但实际上却不是,则sed和其他基于文本的工具将无法正常工作。例如,您可以在字符串中找到一个#,或者找到一个常见的$#
and ${#param}
。
我写了一个名为shfmt的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程序以所需的确切方式删除注释应该相当容易。
您可以像这样使用反向匹配:
#grep -v "#" filename
-v,--invert-match反转匹配感,以选择不匹配的行。(-v由POSIX指定。)
evenmorestuff
以OP的示例开头的行。
grep -o '^[^#]*' file
将是最好的解决方案。吉米吉已经对此进行了解释。感谢您的评论
print "#tag" # Print a hashtag.
我喜欢约瑟夫(Joseph)的答案,但也需要它除去//注释,因此我对其进行了稍微修改并在Redhat上进行了测试
# no comments alias
alias nocom="sed -E '/^[[:blank:]]*(\/\/|#)/d;s/#.*//' | strings"
# example
cat SomeFile | nocom | less
我敢打赌,有一种比使用字符串删除空行更好的方法,但这是我使用的快速而肮脏的解决方案。
-干杯
print "#tag" # Print a hashtag.
最好的解决方案是使用以下命令:
sed -i.$(date +%F) '/^#/d;/^$/d' ntp.conf
-i是就地编辑,但是紧随其后的前缀告诉sed创建备份。在这种情况下,使用日期扩展名(ntp.conf.date),我们运行两个命令,每个命令都有一个地址空间,第一个命令删除注释行,第二个命令用分号与第一个分隔,删除空白行。
我在:theurbanpenguin.com找到了这个解决方案
其他答案似乎都没有做到这一点,它们要么留空行,要么留在注释不在第一个字符处的行。我最终使用了这个:
cat << EOF >> ~/.bashrc
alias nocom='sed -e "/^\s*#/d" -e "/^\s*$/d"'
EOF
这将设置一个别名,这样您就不必记住它了(开头是不可能的)。打开一个新会话,您将拥有新nocom
命令。那你就可以
nocom /etc/foobar.conf
干杯。
.*$
在第一个正则表达式中匹配没有什么意义-锚点没有用,并且您没有捕获要替换的匹配文本。仅使用^\s*
print "#tag" # Print a hashtag.
在阅读完其他内容并附上说明后,我将发布最适合我的方法,并且似乎最有意义。几篇文章接近了,但我还不能发表评论(因为我是新手):
grep -E -v "(^#.*|^$)" filename
-E
=将以下模式解释为正则表达式,类似于使用egrep-v
=打印图案的反转(将打印与表达式不匹配的行)"(^#.*|^$)"
=这有一个指定OR语句的管道。该表达式表示要打印以#
(以及其后的其他任何内容)开头的任何行,或者在该行的开头和结尾之间打印零字符的任何行。该-v
会在屏幕上打印的反转,这将是与字符的任何行不以启动#
。
print "#tag" # Print a hashtag.