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

时间:2016-06-01 01:09:48

标签: bash sed

请耐心等待......

我有一个大的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"

1 个答案:

答案 0 :(得分:7)

使用sed

尝试:

sed '/JOBNAME.*0927/,/TASKTYPE/ {s/TASKTYPE.*/TASKTYPE="NewJob"/}' largefile

这产生输出:

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/ {...}执行花括号中的命令,用于以与正则表达式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/ {...}

    对于以与正则表达式JOBNAME.*0927匹配的行开头并以匹配TASKTYPE之后的第一行结束的行组,执行花括号的命令

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

    执行替换。

  • 1

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

    更详细地说,1是一个合乎逻辑的条件。它评估为“真实”。我们没有指定任何与该条件相关的行动。因此,awk会执行默认操作,即打印行:print $0