如何根据特定的grep注释掉多行?

Dav*_*ave 0 bash awk grep comments sed

这是一个测试文件

dog
dogcatmoose
case $- in 
      *i*);;
        *) return;;
esac

catmoose
case
esac
dog cat
esac
Run Code Online (Sandbox Code Playgroud)

我需要注释掉以下内容:

dog
dogcatmoose
#case $- in 
#      *i*);;
#        *) return;;
#esac

catmoose
case
esac
dog cat
esac
Run Code Online (Sandbox Code Playgroud)

请注意,仅注释掉了特定行。另请注意,我需要对多个文件执行此操作,并且注释掉的那些行可能位于文件的不同区域。然而,这些线将永远在一起。因此我无法根据行号使用 sed 进行注释。

我如何具体注释掉这些行,这将适用于多个文件,其中该部分可能位于文件中的任何位置。我假设我可以 grep on'case $- in'然后注释掉该行以及esac之后的第一个实例的所有行'case $- in'

我怎样才能做到这一点?

Ion*_*tan 6

如果我正确理解问题,那么您可以使用sed范围地址来注释掉该区域:

$ sed '/case $- in/,/esac/ s/^/# /' <<\TEXT
dog
dogcatmoose
case $- in
      *i*);;
        *) return;;
esac

catmoose
case
esac
dog cat
esac
TEXT
Run Code Online (Sandbox Code Playgroud)

输出:

dog
dogcatmoose
# case $- in
#       *i*);;
#         *) return;;
# esac

catmoose
case
esac
dog cat
esac
Run Code Online (Sandbox Code Playgroud)

当然,您也可以就地完成:

dog
dogcatmoose
# case $- in
#       *i*);;
#         *) return;;
# esac

catmoose
case
esac
dog cat
esac
Run Code Online (Sandbox Code Playgroud)