我有一个工作的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。
答案 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
则会添加所需的换行符