【问题标题】:BASH: Find a string in file after finding a first stringBASH:找到第一个字符串后在文件中查找字符串
【发布时间】:2016-06-01 01:09:47
【问题描述】:

请多多包涵……

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

【问题讨论】:

标签: bash sed


【解决方案1】:

使用 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 的行开头并以匹配 @987654325 的第一行结尾的行组执行大括号中的命令 @。

  • 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-the-line:print $0

【讨论】:

  • 这似乎行得通,你能给我一些代码的解释,以便我学习吗?
  • @Vonedaddy 我刚刚添加了一些解释。
  • 最后一条评论,行尾的“1”是什么意思?
  • @Vonedaddy 我也为孤独的1 添加了解释。
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 2018-01-19
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多