使用 bash 命令 awk sed 等从脚本中提取参数字段

Posted

技术标签:

【中文标题】使用 bash 命令 awk sed 等从脚本中提取参数字段【英文标题】:Extract argument fields from a script using bash commands awk sed etc 【发布时间】:2022-01-13 15:32:20 【问题描述】:

我正在尝试从函数参数中使用的各种脚本中提取所有参数。 我有用于查找参数的函数名称,我目前正在使用 awk 和 FS 将其破解以提取已知字段。但这还不够好。我有一些行,其中存在两个函数,检查每个函数的 OR 条件。 语法也因编码器而异:

FUNCT('ARGUMENT') FUNCT("ARGUMENT") 函数(“参数”) FUNCT('参数') || FUNCT('ARGUMENT2') FUNCT('ARGUMENT') && FUNCT('ARGUMENT2')

我当前的脚本分割 FUNCT 调用周围的行,然后分割所有用“;”表示的结束 cmets然后从参数中删除所有字符。但是它无法处理最后一种情况,所以我必须创建一个单独的脚本。

awk 'NF>0 $1 ~ !/^*/ SPLIT($0,a,"FUNCT");分裂(a[2],b,";"); if (length(b[1]>0) print FILENAME","b[1] ' * | sed 's/FUNCT//g' | sed 's/[()'''" ]// g'

我的最终目标是将这些参数列表提取到文件中,然后将它们与参数数据库进行匹配。另一种方法是遍历参数数据库并通过简单的 grep 检查找到它们所在的脚本,但数据库需要一系列格式才能将其转换为简单的文本列表以进行摄取。

【问题讨论】:

【参考方案1】:

与其使用 awk 和 sed 来去除你不想要的部分,你可以使用 Perl 来只提取你想要的部分:

# cat test.txt
FUNCT('ARGUMENT')
FUNCT("ARGUMENT")
FUNCT ('ARGUMENT')
FUNCT('ARGUMENT') || FUNCT('ARGUMENT2')
FUNCT('ARGUMENT') && FUNCT('ARGUMENT2')
NOFUNCT("ARGUMENT")

# perl -ne '
my $q = q["'\''];
my @args = /\bFUNCT\s*\($q(\w+)$q\)/g;
print "@args\n" if @args;
' test.txt
ARGUMENT
ARGUMENT
ARGUMENT
ARGUMENT ARGUMENT2
ARGUMENT ARGUMENT2

【讨论】:

以上是关于使用 bash 命令 awk sed 等从脚本中提取参数字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash脚本中使用Bash / Sed / Awk / Perl删除分隔字符串的最后一个元素[duplicate]

Linux bash 文本处理命令awk,sed,grep 用法

bash shell脚本,如何用sed 命令打印出匹配行和匹配行的第N行

Bash - Linux - 在一行中找到匹配并打印到SED / Awk / Grep行的末尾

Shell基本脚本命令使用教程

awk中使用$0与shell脚本$1有冲突怎么办