使用 grep 删除文件中的注释

使用 grep 删除文件中的注释

我正在尝试使用 grep 从文件(具体来说是 smb.conf)中删除注释,而 bash 给了我一个错误。我发现这个问题如何从文件中删除所有注释?这给出了 grep 执行此操作的语法,但它不会覆盖文件,只是将其打印到终端。我想有效地覆盖该文件。事情是这样的:

 $ sudo grep -o '^[^#]*' /etc/samba/smb.conf >> /etc/samba/smb.conf
-bash: /etc/samba/smb.conf: Permission denied

我以前做过类似的事情,但后来我遵循在线指南,我隐约记得必须先启动 bash,然后才能 grep。显然,我再也找不到那个指南了。

如何使用 grep 删除文件中的注释?

我正在开发运行 Raspbian Jessie 的 Raspberry Pi B+。

答案1

sed -i -e 's/#.*$//' -e '/^$/d' inputFile

除了删除所有注释之外,它还删除空行。我知道你用 grep 询问过,但我想我会建议这个。从功能上讲,它是相同的,甚至更好,通过删除空行,压缩文件的大小,我假设这是你的目标。

编辑:是的,替换#;,你应该很好。至少在我的 CentOS 6 机器上它可以工作。如果它抱怨无效字符或其他内容,您可能需要\在前面放一个 。;

答案2

sed 是一种可以“直接”编辑文件(通过制作文件的临时副本)的选项。此命令将告诉 sed-i就地编辑 /etc/samba/smb.conf ,并且-n默认情况下不打印行。

sudo sed -i -n '/^[^#]/ p' /etc/samba/smb.conf

我们告诉它“p”打印的行是与您的 grep 正则表达式匹配的行,我仅对其进行了轻微修改以删除无关的尾随*。在这里,正则表达式表示“匹配以除奥克托索普”。

答案3

图案要具体,避免删线含有A '#':

sudo sed -r -i 's/^[[:space:]]*#.*$//' /etc/samba/smb.conf

这个问题实际上并没有要求删除空行;该命令保留它们(以及替换产生的空白行)。

与其他解决方案一样,这依赖于-i非标准选项(请参阅POSIX),以及-r(也是非标准的)。选项的使用取决于平台, 当然。

相关内容