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

Vil*_*age 164 bash sed

文件中带有注释的所有行都以#.如何删除以#?开头的所有行(以及只有那些行)?#应忽略包含但不在行开头的其他行.

Ray*_*ger 270

这可以通过sed one-liner完成:

sed '/^#/ d'
Run Code Online (Sandbox Code Playgroud)

这就是说,"找到以#开头并删除它们的所有行,留下其他所有行."

  • 对于像我这样的linux noobs:`sed'/ ^#/ d'<inputFile.txt> outputFile.txt` (72认同)
  • 最短版本:`sed -i'/ ^#/ d'filepath`. (43认同)
  • 和Mac上的`sed -i'''/ ^#/ d'filepath`([因为-i后缀是强制性的](http://stackoverflow.com/a/16746032/125246)) (12认同)
  • 更短的版本:`sed/^#/ d` (9认同)

Kei*_*son 51

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

grep -v '^#' filename
Run Code Online (Sandbox Code Playgroud)

这解决了所述的问题.

但请注意,一个常见的约定是从#一行到一行的所有内容都被视为注释:

sed 's/#.*$//' filename
Run Code Online (Sandbox Code Playgroud)

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

以任意空格开头的行#也可以视为注释:

grep -v '^ *#' filename
Run Code Online (Sandbox Code Playgroud)

如果空格只是空格,或者

grep -v '^[  ]#' filename
Run Code Online (Sandbox Code Playgroud)

其中两个空格实际上是一个空格,后跟一个文字制表符(类型为"control-v tab").

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


ata*_*ata 13

与Raymond的解决方案相反:

sed -n '/^#/!p'
Run Code Online (Sandbox Code Playgroud)

"不要打印任何东西,除了不以#开头的行


jay*_*ngh 7

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

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile
Run Code Online (Sandbox Code Playgroud)


rub*_*o77 6

您可以直接使用

sed -i '/^#/ d'
Run Code Online (Sandbox Code Playgroud)

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

sed -i '/^\s*#/ d'
Run Code Online (Sandbox Code Playgroud)

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

sed -i '/^\s*\(#[^!].*\|#$\)/d'
Run Code Online (Sandbox Code Playgroud)

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

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak
Run Code Online (Sandbox Code Playgroud)


Acu*_*nus 5

这个答案建立在Keith先前的回答之上.

egrep -v "^[[:blank:]]*#" 应过滤注释行.

egrep -v "^[[:blank:]]*(#|$)" 应该过滤掉注释和空行,这通常很有用.

有关[:blank:]其他字符类的信息,请参阅https://en.wikipedia.org/wiki/Regular_expression#Character_classes.