BASH:在找到第一个字符串后在文件中查找字符串
请容忍我 我有一个很大的xml文件,我需要找到一个字符串“JOBNAME=9027”,然后找到它后面包含“TASKTYPE”的那一行,并更改该行 因此,我必须更改JOBNAME=9027之后的TASKTYPE行。有几百行JOBNAME和TASKTYPE行,它们之间的距离各不相同 我试过sed、awk和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"
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"
工作原理:
仅对以与regex/JOBNAME.*0927/,/TASKTYPE/{…}
JOBNAME.*0927匹配的行开始,然后以与
匹配的第一行结束的行组执行大括号中的命令TASKTYPE
将s/TASKTYPE.*/TASKTYPE=“NewJob”/
替换为后面跟有TASKTYPE
的任何内容TASKTYPE=“NewJob”
awk '/JOBNAME.*0927/,/TASKTYPE/ {sub(/TASKTYPE.*/, "TASKTYPE=\"NewJob\"")} 1' largefile
工作原理:
这将仅对以与regex/JOBNAME.*0927/,/TASKTYPE/{…}
JOBNAME.*0927匹配的行开始并以与
匹配的第一行结束的行组执行大括号中的命令TASKTYPE
这将执行替换sub(/TASKTYPE.*/,“TASKTYPE=\“NewJob\”)
与sed不同,awk默认情况下不打印任何内容。这1
是awk用于打印整行内容的神秘速记 更详细地说,1
是一个逻辑条件。它的计算结果为“true”。我们没有指定与该条件一起执行的操作。因此,awk执行其默认操作,即打印行:1
print$0
1
的解释。
awk '/JOBNAME.*0927/,/TASKTYPE/ {sub(/TASKTYPE.*/, "TASKTYPE=\"NewJob\"")} 1' largefile