请多多包涵...
我有一个很大的 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/