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

标签 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"

最佳答案

使用 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/{...} 对以 a 开头的行组执行花括号中的命令与正则表达式 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 的 print-the-whole-line 的神秘简写。

    更详细地说,1 是一个逻辑条件。它评估为“真”。我们没有指定任何操作来满足该条件。因此,awk 执行其默认操作,即打印行:print $0

关于BASH:找到第一个字符串后在文件中查找一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37557924/

相关文章:

linux - 测试 - linux 命令

sed - 如何在 sed 中转义单引号?

linux - 如何在不将其通过管道传输到自身的情况下第二次制作 sed 编辑流?

bash - 什么可以改变 bash 中的命令替换行为?

bash - 将一个文件的每一行与另一个文件的每一行进行比较

Bash 快速失败函数

windows - Windows批处理文件中的git grep和xargs?

bash - Bash/sed/AWK 中大括号的基本解析

linux - 移动文本文件中的特定行

regex - 为什么 sed 不打印可选组?