如果您熟悉大型機 JCL。
我正在嘗試匹配作業卡的最后一行。
基本上//以逗號開頭和結尾的第一行沒有逗號。在示例中,我需要第 3 行或最多匹配的第 3 行。
我正在使用 Ansiblelineinfile在作業卡后動態插入路由卡。
例如:
//SPOOL1 JOB (UU999999999,1103),'Programmer',CLASS=0, <--- start of job card
// REGION=0M,MSGCLASS=R,TIME=5, LINES=(999999,WARNING),
// NOTIFY=&SYSUID <--- end of job card
//STEPNAME EXEC PGM=BPXBATCH
//STDERR DD SYSOUT=*
//STDOUT DD SYSOUT=*
//STDPARM DD *
SH cat /dev/urandom
到目前為止,我得到了這個,它與開頭//和之后的任何內容相匹配,但是,我無法弄清楚最后一部分
^(\Q//\E(.)*)
uj5u.com熱心網友回復:
在一般情況下決議 JCL 很困難。正如評論中所指出的,這些規則充滿了警告。
我有一個JCL的 ANTLR4語法,它是 MIT 許可的。 可能有用。它體現了JCL的美。
uj5u.com熱心網友回復:
要匹配整個作業卡(在本例中為 3 行):
(?sm)\A.*?\/\/[^*]((?!\/\*)[^\n])*[^,]$
見現場演示。
打破這個:
(?sm)s啟用 DOTALL 標志(意味著也.匹配新行)m啟用 MUTLILINE 標志(意味著^和$匹配行的開始和結束
\A意味著輸入的開始(所以它只在最開始匹配).*?意味著什么,但盡可能少//[^*]((?!\/\*)[^\n])*表示非新行,除了序列/*(所以當注釋放入行時不匹配)[^,]不是逗號$行結束
In Chinese:“從開始匹配,直到在不是注釋或不以注釋結尾的行末尾有一個非逗號”
然后您將替換為$0(組零是整個匹配),然后是您注入的內容:
$0\\n*ROUTE statement
uj5u.com熱心網友回復:
您可以使用負回顧后此:(?<!,)。
但是您還需要在 之后插入firstmatch并使用backrefs。
鑒于任務:
- lineinfile:
path: file.jcl
regexp: '^(\/\/.*)(?<!,)$'
line: "\\1\\n//*ROUTE statement"
firstmatch: true
backrefs: true
根據您的示例,您最終會得到:
//SPOOL1 JOB (UU999999999,1103),'Programmer',CLASS=0,
// REGION=0M,MSGCLASS=R,TIME=5, LINES=(999999,WARNING),
// NOTIFY=&SYSUID
//*ROUTE statement
//STEPNAME EXEC PGM=BPXBATCH
//STDERR DD SYSOUT=*
//STDOUT DD SYSOUT=*
//STDPARM DD *
SH cat /dev/urandom
uj5u.com熱心網友回復:
對于一般情況,這比您想象的要困難,因為 JOB 卡范圍內允許發表評論。
//SPOOL1 JOB (UU999999999,1103),'Programmer',CLASS=0, <--- start of job card
// REGION=0M,MSGCLASS=R,TIME=5, LINES=(999999,WARNING),
// NOTIFY=&SYSUID <--- end of job card
您顯示的字串:
- <--- 開始作業卡
- 線=(999999,警告),
- <--- 作業卡結束
在 JCL 中作為注釋都是有效的,因為它們跟在一個空格之后。
您甚至可以在 JOB 卡中添加完整的注釋行。例如:
//name JOB (accounting info),'data capture ___',
//* TYPRUN=SCAN,
// NOTIFY=&SYSUID,
// CLASS=A,MSGCLASS=T,MSGLEVEL=(1,1),TIME=(5,00),
// REGION=5M
因此,除非您可以限制正在查看的 JCL,否則您不一定要尋找第一張不以逗號結尾的卡片。
您的 JOB 卡以 //name JOB 開頭,并在下一張 //name 卡之前結束。*** 編輯 *** 正如正確指出的那樣,JOB 卡后面可以跟一個不需要名稱欄位的卡,例如 // SET。請參閱https://www.ibm.com/docs/en/zos/2.4.0?topic=statements-jcl-statement-fields *** 編輯結束 ***
它以 ^(\Q//\E)[A-Z0-9] \s \QJOB\E. 開頭,并在下一張命名卡 ^(\Q//\E)[A-Z0- 之前結束9] \s
但我不太了解正則運算式,無法找到插入新行的“就在之前”點。希望其他人可以添加。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385206.html
