BASH:在找到第一个字符串后在文件中查找字符串

BASH:在找到第一个字符串后在文件中查找字符串,bash,sed,Bash,Sed,请容忍我 我有一个很大的xml文件,我需要找到一个字符串“JOBNAME=9027”,然后找到它后面包含“TASKTYPE”的那一行,并更改该行 因此,我必须更改JOBNAME=9027之后的TASKTYPE行。有几百行JOBNAME和TASKTYPE行,它们之间的距离各不相同 我试过sed、awk和bash都没有用。我确信有办法做到这一点,但我还是逃避了 例如: JOBNAME="MYSAP#SDOR-SG-D-LATECODED-0927" JUL="1"

请容忍我

我有一个很大的xml文件,我需要找到一个字符串“JOBNAME=9027”,然后找到它后面包含“TASKTYPE”的那一行,并更改该行

因此,我必须更改JOBNAME=9027之后的TASKTYPE行。有几百行JOBNAME和TASKTYPE行,它们之间的距离各不相同

我试过sed、awk和bash都没有用。我确信有办法做到这一点,但我还是逃避了

例如:

JOBNAME="MYSAP#SDOR-SG-D-LATECODED-0927"
            JUL="1"
            JUN="1"
            MAR="1"
            MAXDAYS="0"
            MAXRERUN="0"
            MAXRUNS="0"
            MAXWAIT="0"
            MAY="1"
            MULTY_AGENT="N"
            NODEID="sappr2"
            NOV="1"
            OCT="1"
            PARENT_FOLDER="MYSAP#SSDOR-D-SG-LATECODED-0927"
            PRIORITY="10"
            RETRO="0"
            RULE_BASED_CALENDAR_RELATIONSHIP="O"
            RUN_AS="MYSAP"
            SEP="1"
            SHIFT="Ignore Job"
            SHIFTNUM="+00"
            SUB_APPLICATION="MYSAP"
            SYSDB="0"
            TASKTYPE="Job"
使用sed 尝试:

这将产生以下输出:

JOBNAME="MYSAP#SDOR-SG-D-LATECODED-0927"
            JUL="1"
            JUN="1"
            MAR="1"
            MAXDAYS="0"
            MAXRERUN="0"
            MAXRUNS="0"
            MAXWAIT="0"
            MAY="1"
            MULTY_AGENT="N"
            NODEID="sappr2"
            NOV="1"
            OCT="1"
            PARENT_FOLDER="MYSAP#SSDOR-D-SG-LATECODED-0927"
            PRIORITY="10"
            RETRO="0"
            RULE_BASED_CALENDAR_RELATIONSHIP="O"
            RUN_AS="MYSAP"
            SEP="1"
            SHIFT="Ignore Job"
            SHIFTNUM="+00"
            SUB_APPLICATION="MYSAP"
            SYSDB="0"
            TASKTYPE="NewJob"
工作原理:

  • /JOBNAME.*0927/,/TASKTYPE/{…}
    仅对以与regex
    JOBNAME.*0927匹配的行开始,然后以与
    TASKTYPE
    匹配的第一行结束的行组执行大括号中的命令

  • s/TASKTYPE.*/TASKTYPE=“NewJob”/
    TASKTYPE
    替换为后面跟有
    TASKTYPE=“NewJob”
    的任何内容

使用awk 此awk脚本使用相同的逻辑:

awk '/JOBNAME.*0927/,/TASKTYPE/ {sub(/TASKTYPE.*/, "TASKTYPE=\"NewJob\"")} 1' largefile
工作原理:

  • /JOBNAME.*0927/,/TASKTYPE/{…}

    这将仅对以与regex
    JOBNAME.*0927匹配的行开始并以与
    TASKTYPE
    匹配的第一行结束的行组执行大括号中的命令

  • sub(/TASKTYPE.*/,“TASKTYPE=\“NewJob\”)

    这将执行替换

  • 1

    与sed不同,awk默认情况下不打印任何内容。这
    1
    是awk用于打印整行内容的神秘速记

    更详细地说,
    1
    是一个逻辑条件。它的计算结果为“true”。我们没有指定与该条件一起执行的操作。因此,awk执行其默认操作,即打印行:
    print$0


给出一个示例块和您希望从中获得的输出。这里有一个块,记住会有多个类似的数据。它一直告诉我输入的文本太长。可能相关:或者请和这个问题上的chuck…这似乎有效,你能给我解释一下代码吗?Vonedaddy我刚刚添加了一些解释。最后一条评论是,行末的“1”是什么意思?@Vonedaddy我也添加了一个对单个
1
的解释。
awk '/JOBNAME.*0927/,/TASKTYPE/ {sub(/TASKTYPE.*/, "TASKTYPE=\"NewJob\"")} 1' largefile