bash - 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/ {...}只对以匹配regexJOBNAME.*0927的行开始并以匹配TASKTYPE的第一行结束的行组执行大括号中的命令。
s/TASKTYPE.*/TASKTYPE="NewJob"/TASKTYPE替换TASKTYPE="NewJob"和其后的任何内容。
用锥子
这个awk脚本使用相同的逻辑:
awk '/JOBNAME.*0927/,/TASKTYPE/ {sub(/TASKTYPE.*/, "TASKTYPE=\"NewJob\"")} 1' largefile

工作原理:
/JOBNAME.*0927/,/TASKTYPE/ {...}
这将只对以匹配regexJOBNAME.*0927的行开始并以匹配TASKTYPE的第一行结束的行组执行大括号中的命令。
sub(/TASKTYPE.*/, "TASKTYPE=\"NewJob\"")
这将执行替换。
1
与sed不同,awk在默认情况下不会打印任何内容。这是awk对打印整行的神秘速记。
更详细地说,1是一个逻辑条件它的计算结果为“true”。我们没有指定与该条件一致的操作。因此,awk执行其默认操作,即打印行:1

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

相关文章:

regex - 使用正则表达式从 fasta 文件中获取特定序列

bash - 将标准输入参数传递给正在使用 gdb 调试的可执行文件

node.js - npm 脚本忽略 grep 命令的参数

bash - 通过变量将背景运算符(&)附加到命令

linux - 如何转义变量以供sed使用?

regex - 在文件中替换/插入时间戳

bash - shell 脚本中通配符 * 的奇怪行为

linux - Bash脚本重命名子目录中的文件-基于文件名

linux - 使用 shell 脚本替换文件中的 token

linux - 重复从一行中提取组名?