在我的脚本中,我需要将文件 $CURFILEPATH 中的 TEXT('...') 内容存储到名为 $SRCTEXT 的 bash 变量中。
TEXT('...') 变量包含在包含 IBM i CLLE 命令的各种文件中。
在 CLLE 中,
+
是延续字符,因此请忽略行尾的它。
TEXT('...') 目标还可能包含双单引号,如下所示:
TEXT('Bob O''Malley''s favorite DTAARA'). It might also contain other characters like
(,
)`,
这是一个简单的文件示例,其中要提取的 $SRCTEXT 位于一行上:
/* Create and set data area for PHP binary location - 1.0.24 */
CRTDTAARA DTAARA(PHPPATH) TYPE(*CHAR) LEN(255) +
VALUE(' ') TEXT('Path to PHP Binaries')
对于该文件 $SRCTEXT 应该是“PHP 二进制文件的路径”。
这是一个更困难的示例,其中 TEXT('...') 变量通过连续字符
+
跨多行延伸。
/* Create and set data area for Python binary location - 1.05 */
CRTDTAARA DTAARA(PYPATH) TYPE(*CHAR) LEN(255) +
VALUE('/QOpenSys/pkgs/bin') TEXT('Path to +
Python Binaries')
对于该文件 $SRCTEXT 应该是“Python 二进制文件的路径”
在 TEXT('...') 目标中使用
''
和 ()
的其他边缘情况示例文件
/* Create and set data area for Python binary location - 1.05 */
CRTDTAARA DTAARA(PYPATH) TYPE(*CHAR) LEN(255) +
VALUE('/QOpenSys/pkgs/bin') TEXT('Path to +
Python Language''s Binaries (this is an edge case)')
对于该文件 $SRCTEXT 应该是“Python 语言二进制文件的路径(这是一个边缘情况)”
请注意,报价应保持双倍。
虽然不太可能,但 TEXT('...') 变量可以 跨越 3 行或更多带有连续字符的行。处理这个问题会很好,但是 2 行解决方案也是可以接受的。
任何使用 awk、sed、grep 等的 Bash 解决方案都是可以接受的。
ChatGPT 给了我类似
grep -oP "(?<=TEXT ')[^']+" $CURFILEPATH
的东西,但这不起作用。
使用 GNU awk 处理多字符
RS
和 RT
:
$ awk -v RS='\\<TEXT[(]\047(([^\047]|\047\047)+)\047[)]' 'RT{$0=RT; gsub(/^[^\047]+\047|\047[^\047]+$/,""); gsub(/\+\n/,""); gsub(/\047\047/,"\047"); print}' file1
Path to PHP Binaries
$ awk -v RS='\\<TEXT[(]\047(([^\047]|\047\047)+)\047[)]' 'RT{$0=RT; gsub(/^[^\047]+\047|\047[^\047]+$/,""); gsub(/\+\n/,""); gsub(/\047\047/,"\047"); print}' file2
Path to Python Binaries
$ awk -v RS='\\<TEXT[(]\047(([^\047]|\047\047)+)\047[)]' 'RT{$0=RT; gsub(/^[^\047]+\047|\047[^\047]+$/,""); gsub(/\+\n/,""); gsub(/\047\047/,"\047"); print}' file3
This is JDubbTX's Text