使用“sed”取消注释与特定模式匹配的行

使用“sed”取消注释与特定模式匹配的行

我正在尝试取消注释文件的某些行,注释以一个选项开头,后面跟着 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

相关内容