Bash 脚本逻辑根据分隔符提取文件中跨多行的文本

问题描述 投票:0回答:1

在我的脚本中,我需要将文件 $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
的东西,但这不起作用。

bash shell awk sed scripting
1个回答
0
投票

使用 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
© www.soinside.com 2019 - 2024. All rights reserved.