请耐心等待......
我有一个大的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"
答案 0 :(得分:7)
尝试:
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 '/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
。