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"
假设我有一个配置文件 (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"