如何只注释带有Sed的未注释行并留下100%完整的空白/空行?

时间:2016-01-24 22:56:32

标签: linux bash sed

我正在整理一些Bash配置脚本来配置Linux服务器,我希望能够对文件中所有未注释的行进行注释,但保留空白/空行完好无损。

使用the great answer to this question我能够想出这款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做到这一点?

2 个答案:

答案 0 :(得分:2)

这个怎么样:

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

答案 1 :(得分:1)

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

另一种方式,在awk

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

这会将#添加到非空的每一行,而不是以#开头。