Bash:显示有效文件内容,不含注释和空行

Bash: display effective file content without comments and empty lines

假设我有一个配置文件 (stuff.conf),它看起来像这样(我的真实文件大约有 1000 行):

# Some comment
foo=bar

# Other comment
foobar=barfoo

# Another one
abc=123 # inline comment
....

我想显示这个文件中的有效值,没有任何注释或空行。我想打印的是:

foo=bar
foobar=barfoo
abc=123
...

我可以去掉空行和注释行:

cat stuff.conf | grep -v "#" | grep -v "^$"

但它也会删除注释标记 (#) 不在行首的行(例如:abc=123 # inline comment)。输出如下所示:

foo=bar
foobar=barfoo
...

问题:

如何显示所有不以 # 开头的行或空行?在 abc=123 # inline comment 的特殊情况下,我不关心行尾的注释是否显示。

使用 sed 你可以这样做:

sed -E '/^[[:blank:]]*(#|$)/d; s/#.*//' file

foo=bar
foobar=barfoo
abc=123
  • 正则表达式 /^[[:blank:]]*(#|$)/ 将匹配所有以 # 开头的行,前面有可选的空格,或者如果只有一个空行有空格。
  • /d 将删除这些行并且
  • s/#.*// 将删除行内评论。

用你的命令:

cat stuff.conf | grep -v "#" | grep -v "^$"

grep -v "^$"避免空行的方法相同,对于以“#”开头的行,即“^#”,也可以这样做:

cat stuff.conf | grep -v "^#" | grep -v "^$"

说,注意那个 cat 命令的无用,最好只使用一个 grep,我的意思是:

grep -v "^#\|^$" stuff.conf

但这不会删除行内注释,因为您可以删除文件中任何位置带有“#”字符的任何句子sed,即:

grep -v "^#\|^$" stuff.conf | sed -e "s/#.*$//g"