如何在匹配#1之后找到的行中替换匹配的文本(match#2)

时间:2019-02-04 14:07:30

标签: unix sed

我必须找到解决该问题的方法:仅当第二行具有 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)

有人可以帮助我找到解决方案吗?

谢谢 :)

1 个答案:

答案 0 :(得分:0)

尝试一下:

sed -e '/sapstartsrv/{' -e 'n;s/AB1_DVEBMGS20_eati01/XX1_DVEBMGS20_eati01/g}' file

您非常接近,错误是p和引号。
n将打印hold space,因此无需使用p
替换需要在条件块内。
为了兼容,sed每当启动-e并关闭{时,都需要启动新的}块。