如何使用 Sed 仅注释掉未注释的行,并保留空白/空行 100% 不变



我正在整理一些 Bash 配置脚本来配置 Linux 服务器,我希望能够注释文件中所有未注释的行,但保留空白/空行不变且保持不变。

使用这个问题的出色答案,我能够想出这个运行良好的 Sed 一衬里:

sed -e '/^#/!s/(.*)/# 1/g' /etc/update-motd.d/90-updates-available

当然,当我在生产设置上运行此 Sed 命令时,-e将与 -i 交换以将文件写入到位,但无论如何,该文件的内容被成功注释掉,如下所示:

#!/bin/sh
# 
# if [ -x /usr/lib/update-notifier/update-motd-updates-available ]; then
#     exec /usr/lib/update-notifier/update-motd-updates-available
# fi

但理想情况下,我希望输出是这样的;请注意一个空白/空行是如何保持不变的。

#!/bin/sh
# if [ -x /usr/lib/update-notifier/update-motd-updates-available ]; then
#     exec /usr/lib/update-notifier/update-motd-updates-available
# fi

在 Sed 中有什么办法可以做到这一点吗?

这个怎么样:

sed -e 's/^([^#].*)/# 1/g' /etc/update-motd.d/90-updates-available

s的地址从 /^#/! 扩展到 /^(#.*)?$/!(以 # 开头的行,或不包含任何内容)。

另一种方式,在awk

awk '$0 && $0 !~ /^#/ {printf "# "}1'

这会向不为空且不以 # 开头的每一行添加#

最新更新