![使用“sed”取消注释与特定模式匹配的行](https://linux22.com/image/161678/%E4%BD%BF%E7%94%A8%E2%80%9Csed%E2%80%9D%E5%8F%96%E6%B6%88%E6%B3%A8%E9%87%8A%E4%B8%8E%E7%89%B9%E5%AE%9A%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C.png)
我正在尝试取消注释文件的某些行,注释以一个选项开头,后面跟着 1 行或多行注释。这是我尝试处理的文件的最小示例 ( example.txt
):
# Ignore this one
# first-option)
# something-something x \
# run-something-else y \
# run-after-this z \
# set-some-config-var 10 10
# Uncomment this one
# second-option)
# something x \
# run-something-else y \
# run-something-else-again z \
# run-after-this-something z \
# set-some-config-var 10 10 \
# set-some-config-var cool
和我的天真的解决方案(test.sed
),首先找到所需的模式,然后应用重复替换:
#!/usr/bin/env sed
/#.*second-option/{
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
s/# //; p; n;
}
输出:
$ sed -n -f test.sed example.txt
second-option)
something x \
run-something-else y \
run-something-else-again z \
run-after-this-something z \
set-some-config-var 10 10 \
set-some-config-var cool
我并不熟悉所有 sed
选项,但很好奇是否有一种更通用的方法(或更简单的方法)。
答案1
我会使用地址范围。我们希望在看到空行时开始second-option
,在看到空行时结束:
#!/bin/sed -f
/^#.*second-option/,/^#? *$/s/^# //
# from | to | substitute
答案2
$ sed -e '
/^#[[:blank:]]*second-option[)]$/!b
:a;$!N;s/\\$/&/;ta
s/\(\n\)#/\1/g;s/^#//
' file
在bash
命令行中Posix sed
或者使用 Gnu sed 执行以下操作:
$ sed -e '/^#\s*second-option[)]$/,/[^\]$/s/^#//' file