我必须找到解决该问题的方法:仅当第二行具有 match #2
并且前一行具有 match #1
时,才需要替换文本。
我将解释...我在文件中有此文本:
ms.sapAB1_ASCS10 critical 1- TT_SAP 0000-2400 *
*PUSER AB1adm
ms.sapAB1_SCS11 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
en.sapAB1_ASCS10 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
en.sapAB1_SCS11 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
ig.sapAB1_DVEBMGS20 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
sapstartsrv critical 1- TT_SAP 0900-1700 1-5
*ARGS pf=/.*/AB1_DVEBMGS20_eati01
sapstartsrv critical 1- TT_SAP 0900-1700 1-5
*ARGS pf=/.*/START_ASCS10_eati01
sapstartsrv critical 1- TT_SAP 0900-1700 1-5
*ARGS pf=/.*/START_SCS11_eati01
icman critical 1- TT_SAP 0000-2400 *
*ARGS pf=/usr/sap/AB1/SYS/profile/AB1_DVEBMGS20_eati01
因此,在我的情况下,仅当 match #2
中包含 XX1_DVEBMGS20_eati01
时,我才需要用match #1
替换 match #2
。前一行。
因此,对于:
AB1_DVEBMGS20_eati01
= match #1
和 sapstartsrv
= ms.sapAB1_ASCS10 critical 1- TT_SAP 0000-2400 *
*PUSER AB1adm
ms.sapAB1_SCS11 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
en.sapAB1_ASCS10 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
en.sapAB1_SCS11 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
ig.sapAB1_DVEBMGS20 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
sapstartsrv critical 1- TT_SAP 0900-1700 1-5
*ARGS pf=/.*/XX1_DVEBMGS20_eati01
sapstartsrv critical 1- TT_SAP 0900-1700 1-5
*ARGS pf=/.*/START_ASCS10_eati01
sapstartsrv critical 1- TT_SAP 0900-1700 1-5
*ARGS pf=/.*/START_SCS11_eati01
icman critical 1- TT_SAP 0000-2400 *
*ARGS pf=/usr/sap/AB1/SYS/profile/AB1_DVEBMGS20_eati01
结果必须是:
icman
(match #2
之后的行不应更改,尽管它也具有 sed -e "s/AB1_DVEBMGS20_eati01/XX1_DVEBMGS20_eati01/" ./teste.cfg > ./teste_new2.cfg
)
理想情况下,我需要使用sed进行此操作,并且它需要在任何Unix计算机(不仅是Linux)上都能工作。
到目前为止,我已经尝试过:
AB1_DVEBMGS20_eati01
->但它改变了sed -e "/sapstartsrv/{n;p;}" -e "s/AB1_DVEBMGS20_eati01/XX1_DVEBMGS20_eati01/" ./teste.cfg > ./teste_new2.cfg
ms.sapAB1_ASCS10 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
ms.sapAB1_SCS11 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
en.sapAB1_ASCS10 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
en.sapAB1_SCS11 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
ig.sapAB1_DVEBMGS20 critical 1- TT_SAP 0000-2400 *
*PUSER ab1adm
sapstartsrv critical 1- TT_SAP 0900-1700 1-5
*ARGS pf=/.*/AB1_DVEBMGS20_eati01
*ARGS pf=/.*/XX1_DVEBMGS20_eati01
sapstartsrv critical 1- TT_SAP 0900-1700 1-5
*ARGS pf=/.*/START_ASCS10_eati01
*ARGS pf=/.*/START_ASCS10_eati01
sapstartsrv critical 1- TT_SAP 0900-1700 1-5
*ARGS pf=/.*/START_SCS11_eati01
*ARGS pf=/.*/START_SCS11_eati01
icman critical 1- TT_SAP 0000-2400 *
*ARGS pf=/usr/sap/AB1/SYS/profile/XX1_DVEBMGS20_eati01
->这是结果:
collection.replaceOne({_id: newObj._id}, newObj)
有人可以帮助我找到解决方案吗?
谢谢 :)
答案 0 :(得分:0)
尝试一下:
sed -e '/sapstartsrv/{' -e 'n;s/AB1_DVEBMGS20_eati01/XX1_DVEBMGS20_eati01/g}' file
您非常接近,错误是p
和引号。
n
将打印hold space
,因此无需使用p
。
替换需要在条件块内。
为了兼容,sed
每当启动-e
并关闭{
时,都需要启动新的}
块。