当一行与模式匹配时,我可以在sed中执行两个命令吗?

时间:2018-03-01 08:41:57

标签: sed

我有一个工作的sed命令,用于搜索rm a-file,对其进行评论并在其下方添加另一行(rm another-file):

sed -e '/^rm a-file/s;^;# ;'            \
    -e '/# rm a-file/a rm another file' \
    my.script

我想知道是否可能以某种方式将两个编辑组合在一起,注释附加到一个命令中,这样我就必须只指定一次匹配模式(/^rm a-file/)。

如果重要,我正在使用gnu sed。

2 个答案:

答案 0 :(得分:3)

您可以像这样重新组合:

SED命令:

$ cat commands.sed 
/^rm a-file/{
  s@^@# @
  a rm another file
}

<强> INPUT:

$ cat myscript.sh 
rm a-file
blabla
rm a-file
blabla2

<强>输出:

$ sed -f commands.sed myscript.sh                              
# rm a-file
rm another file
blabla
# rm a-file
rm another file
blabla2

<强>说明:

这将查找以rm a-file开头的行,然后将^替换为#(注释初始rm命令),然后只有当rm another file时才会追加行^rm a-file line尊重条件sed -e '/^rm a-file/{s@^@# @; a rm another file' -e '}'

这也可以在单行中完成,正如Sundeep所建议的那样:(https://www.gnu.org/software/sed/manual/sed.html#Commands-Requiring-a-newline

BEGIN HEADER
    CharacterSet "CP1252"
   ExportingTool "IBM InfoSphere DataStage Export"
   ToolVersion "8"
   ServerName "MIAIBV240"
   ToolInstanceID "DFDMGBL2"
   MDISVersion "1.0"
   Date "2018-02-12"
   Time "17.32.28"
   ServerVersion "8.7"
END HEADER
BEGIN DSJOB
    Identifier "job_FDM_WVD_NET_SALES_DSC_STG_REPL_Load"
   DateModified "2018-02-12"
   TimeModified "17.32.24"
   BEGIN DSRECORD
      Identifier "C52"
      OLEType "CContainerStage"
      Readonly "0"
      Name "ShcFileAudit_Verif_Data"
      NextID "3"
      BEGIN DSSUBRECORD
         Name "FDM_CMN"
         Description "#FDM_CMN#"
         ValueType "0"
      END DSSUBRECORD
      BEGIN DSSUBRECORD
         Name "FILE_NAME"
    FullDescription =+=+=+=#------------------------------------------------------------------------------- Description:

Some desc here .... 
#   Date                 Issue                         Version              
=+=+=+=
      JobVersion "56.0.0"
      ControlAfterSubr "0"
      Parameters "CParameters"
      END DSSUBRECORD
END DSRECORD
END DSJOB

答案 1 :(得分:0)

使用GNU sed,这个特殊情况也可以通过简单替换来解决

$ sed 's/^rm a-file.*/# &\nrm another file/' my.script
# rm a-file
rm another file
blabla
# rm a-file
rm another file
blabla2
  • ^rm a-file.*以匹配从rm a-file开始的行,然后.*来捕获剩余的行以便重复使用
  • # &\nrm another file &此处将包含完整匹配的文字,而\n则会添加所需的换行符