从文件中删除所有以#开头的行


182

文件中所有带注释的行均以开头#。如何删除所有以开头的行(并且仅删除那些行)#?其他包含#,但不在该行开头的行应被忽略。


1
#blah \<nl>blah因为反斜杠转义了换行符,它是否必须与被视为单个“逻辑行” 的通用约定一起工作?
sarnold

@sarnold:除了之外make,哪些实用程序在结束评论之前使用“反斜杠拼接线”?外壳(经过bash和ksh测试)没有。C和C ++确实在预处理器指令的其他处理之前处理换行符拼接,但是它们是指令而不是注释。
乔纳森·勒夫勒

@乔纳森:太好了。我以为普通\<nl>转义也可以用于评论。但是哇,我错了。我还没有找到另一个例子... :)谢谢!
sarnold

Answers:


301

这可以用sed单线完成:

sed '/^#/d'

这就是说:“查找以#开头的所有行,然后将其删除,然后保留其他所有内容。”


9
较短的版本:sed /^#/d
kev 2012年

80
对于像我这样的Linux新手:sed '/^#/ d' < inputFile.txt > outputFile.txt
Neil McGuigan

49
最短版本:sed -i '/^#/d' filepath
lesderid 2014年

14
sed -i '' '/^#/d' filepath在Mac(因为-i后缀是强制性的
paulcm

1
@Viesturs尝试一下: awk '/^#/ && !first { first=1 ; next } { print $0}'
Raymond Hettinger

56

我有点惊讶,没有人提出最明显的解决方案:

grep -v '^#' filename

这样解决了上述问题。

但请注意,一个通用约定是将从a #到行尾的所有内容都视为注释:

sed 's/#.*$//' filename

但是,例如,它将#字符串文字中的字符视为注释的开头(可能与您的情况无关)(并且留空行)。

以任意空格开头的行,其后#也可能被视为注释:

grep -v '^ *#' filename

如果空格只是空格,或者

grep -v '^[  ]#' filename

其中两个空格实际上是一个空格,后跟一个文字制表符(键入“ control-v制表符”)。

对于所有这些命令,请忽略filename要从标准输入读取的参数(例如,作为管道的一部分)。


我添加了一个基于此答案的答案。
Acumenus

在Windows上以这种方式使用grep遇到麻烦。解决方案是将“替换为”,例如grep -v "^#" filename
Serg 2014年

14

雷蒙德解决方案的反面:

sed -n '/^#/!p'

“除了不以#开头的行外,不输出任何内容”


8

您可以直接使用

sed -i '/^#/ d'

如果您还想删除以空格开头的注释行

sed -i '/^\s*#/ d'

通常,如果要保留脚本的第一行(如果是shabang),sed则不要删除以开头的行#!。它也应该删除仅包含哈希而不包含文本的行。放在一起:

sed -i '/^\s*\(#[^!].*\|#$\)/d'

为了与所有sed变体保持一致,您需要在该-i选项中添加备用扩展名:

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

加上1表示哪个空间
deepaksingh pawar,

7

您可以将以下内容用于awk解决方案-

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile


-3

这是带有所有扩展名的所有文件的循环:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.