我想洗掉某些格式后的所有文本。
<JOB APPLICATION="Daily" SUB_APPLICATION="Y#D5#4#M2F" JOBNAME="MLETTXXD-NONR_005" DESCRIPTION="" CREATED_BY="vpma" RUN_AS="ctmagt" CRITICAL="0" TASKTYPE="Dummy" NODEID="OPENFRAME" %%ENVIRONMENT MLETTXXD %%ORDERID %%RUNCOUNT %%JCL_STEP" CONFIRM="0" RETRO="0" MAXRERUN="0" AUTOARCH="1" MAXDAYS="0" MAXRUNS="0" TIMETO=">" JAN="1" FEB="1" MAR="1"
<INCOND NAME="PROD-A#D5#4#M2F-STRTDAYA-001-OK" ODATE="ODAT" AND_OR="A" />
<INCOND NAME="PROD-PS#P#D3#SU2SA@E-TIME0000-098-OK" ODATE="ODAT" AND_OR="A" />
洗掉前后所有字串JOBNAME="..."
輸出應該是
JOBNAME="MLETTXXD-NONR_005"
<INCOND NAME="PROD-A#D5#4#M2F-STRTDAYA-001-OK" ODATE="ODAT" AND_OR="A" />
<INCOND NAME="PROD-PS#P#D3#SU2SA@E-TIME0000-098-OK" ODATE="ODAT" AND_OR="A" />
我在下面嘗試過,但在第二種awk情況下沒有發生。
awk '/JOBNAME=/{print $4} | /INCOND/{print $2}' inputfile.txt
uj5u.com熱心網友回復:
使用sed
$ sed s'/.*\(JOBNAME[^ ]*\).*/\1/' input_file
JOBNAME="MLETTXXD-NONR_005"
<INCOND NAME="PROD-A#D5#4#M2F-STRTDAYA-001-OK" ODATE="ODAT" AND_OR="A" />
<INCOND NAME="PROD-PS#P#D3#SU2SA@E-TIME0000-098-OK" ODATE="ODAT" AND_OR="A" />
uj5u.com熱心網友回復:
對 OP 當前awk代碼的一個簡單修復:
$ awk '/JOBNAME=/{$0=$4}1' inputfile.txt
JOBNAME="MLETTXXD-NONR_005"
<INCOND NAME="PROD-A#D5#4#M2F-STRTDAYA-001-OK" ODATE="ODAT" AND_OR="A" />
<INCOND NAME="PROD-PS#P#D3#SU2SA@E-TIME0000-098-OK" ODATE="ODAT" AND_OR="A" />
筆記:
$0=$4說用第四個欄位的內容替換當前行- 假設 OP 的
/INCOND/模式匹配是嘗試列印其余的輸入行,因此...... - 獨立的
1說列印當前行
這有一些限制:
- 假設
JOBNAME="..."字串總是在一行的第 4 個空格分隔的欄位中 - 不考慮單行中字串的多個實體
- 假定字串不包含任何空格
解決限制...
首先,我們將在輸入中添加一個新行:
$ cat inputfile.txt
<JOB APPLICATION="Daily" SUB_APPLICATION="Y#D5#4#M2F" JOBNAME="MLETTXXD-NONR_005" DESCRIPTION="" CREATED_BY="vpma" RUN_AS="ctmagt" CRITICAL="0" TASKTYPE="Dummy" NODEID="OPENFRAME" %%ENVIRONMENT MLETTXXD %%ORDERID %%RUNCOUNT %%JCL_STEP" CONFIRM="0" RETRO="0" MAXRERUN="0" AUTOARCH="1" MAXDAYS="0" MAXRUNS="0" TIMETO=">" JAN="1" FEB="1" MAR="1"
<INCOND NAME="PROD-A#D5#4#M2F-STRTDAYA-001-OK" ODATE="ODAT" AND_OR="A" />
<INCOND NAME="PROD-PS#P#D3#SU2SA@E-TIME0000-098-OK" ODATE="ODAT" AND_OR="A" />
<JOB APPLICATION="Daily" JOBNAME="JOBNAME # 1" DESCRIPTION="" JOBNAME="Another Job" CREATED_BY="vpma"
一個GNU awk想法:
awk '
BEGIN { FPAT="\\<JOBNAME=\"[^\"]*\"" } # define field pattern as JOBNAME="..."
NF { pfx="" # if we have a FPAT match then NF>0
for (i=1;i<=NF;i ) { # loop through our FPAT matches
printf "%s%s",pfx,$i # print each FPAT match to stdout
pfx=OFS
}
print "" # terminate the line of FPAT matches
next # go to next line of input
}
1 # print all lines that do not have a FPAT match
' inputfile.txt
筆記:
GNU awk需要FPAT支持(這允許我們定義欄位的格式;這取代了FS定義欄位分隔符格式的使用)- 獨立
1假設 OP 要列印與字串不匹配的所有其他輸入行JOBNAME="..."(否則 OP 應更新示例輸入以包含不應列印的行)
這會產生:
JOBNAME="MLETTXXD-NONR_005"
<INCOND NAME="PROD-A#D5#4#M2F-STRTDAYA-001-OK" ODATE="ODAT" AND_OR="A" />
<INCOND NAME="PROD-PS#P#D3#SU2SA@E-TIME0000-098-OK" ODATE="ODAT" AND_OR="A" />
JOBNAME="JOBNAME # 1" JOBNAME="Another Job"
uj5u.com熱心網友回復:
使用這個 Perl 單行:
perl -pe 's{ .* ( JOBNAME="[^"]*" ) .* }{$1}x;' in_file > out_file
Perl 單行器使用這些命令列標志:
-e:告訴 Perl 查找行內代碼,而不是在檔案中。
-p:一次回圈輸入一行,$_默認情況下將其分配給。print $_在每次回圈迭代后添加。
正則運算式使用這些修飾符:
/x: 忽略空格和注釋,以提高可讀性。
s{ .* ( JOBNAME="[^"]*" ) .* }{$1};:替換此模式:.*- 任何字符重復 0 次或多次,后跟JOBNAME="[^"]*",它具有[^"]*-除 之外 "的任何字符,重復 0 次或多次,后跟.*。將此模式替換為$1: 第一個捕獲組,即括號內匹配的任何內容。
還請參見
perldoc perlrun::如何執行 Perl 解釋器:命令列開關
perldoc perlre:Perl 正則運算式(正則運算式)
perldoc perlre:Perl 正則運算式(正則運算式):量詞;字符類和其他特殊轉義;斷言;捕獲組
perldoc perlrequick:Perl 正則運算式快速入門
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485034.html
