【问题标题】:Bash: display effective file content without comments and empty linesBash:显示有效的文件内容,没有注释和空行
【发布时间】:2017-08-08 20:44:11
【问题描述】:

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

# Some comment
foo=bar

# Other comment
foobar=barfoo

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

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

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 的特殊情况下,我不在乎是否显示行尾的注释。

【问题讨论】:

  • 你需要保留制表/缩进还是剥离它?
  • 保留制表符/缩进会很好;但如果您有一个不保留制表符/缩进的解决方案,那也没关系

标签: bash grep cat


【解决方案1】:

使用sed 你可以这样做:

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

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

【讨论】:

  • OP 在他想要的输出中提到他也想删除#inline comment
  • 愿正则表达式之神保佑你 :) 感谢您的回答@anubhava
【解决方案2】:

用你的命令:

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

与避免grep -v "^$"的空行相同,您可以对以“#”开头的行,即“^#”执行相同的操作,如下所示:

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

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

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

但这不会删除内联 cmets,因为您可以使用 sed 删除文件任何位置的“#”字符外观中的任何句子,即:

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

【讨论】:

  • 与 anubhava 第一个解决方案相同的问题,这不会删除内联 cmets
  • @Aserre 当然,我也在尝试用grep 找到方法,但没能做到,所以最后我也不得不使用sed
猜你喜欢
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
相关资源
最近更新 更多