我一直在尝试使用grep/awk/sed获取云函数,但是当前命令不能以多行格式获取云函数。
这是在运行时作为变量传递的当前命令:
deploy.sh
functions_list=$(grep 'export' src/index.ts | awk -F '[}{]' '{print $2}' | sed 's/^ *//; s/ *$//; /^$/d' | grep -v somefunction || echo '')
index.ts
export { functionA } from './functions';
export { functionB } from './functions';
export {
functionC,
functionD,
functionE
} from './functions';
export { functionF } from './functions';
export { functionG } from './functions';
输出如下:
functionA
functionB
functionF
functionG
谁知道如何让输出变成这样?
functionA
functionB
functionC
functionD
functionE
functionF
functionG
参见最后命令:
functions_list=$(awk 1 ORS=' ' src/index.ts | sed -e 's/ / /g ; s/;/n/g' | awk -F '[}{]' '{print $2}' | sed 's/^ *//; s/ *$//; /^$/d; s/, /n/g' | grep -v somefunction || echo '')
awk逐行读取/扫描输入;因此跳过functionC、functionond和functionone因为它们不属于所提供的模式:
'[}{]' '{print $2}'
我添加了awk/sed命令,最初用空格替换新行。
awk 1 ORS=' ' src/index.ts | sed -e 's/ / /g ; s/;/n/g'
最后,用换行符替换逗号。
s/, /n/g
这里的解析非常脆弱。在不使事情过于复杂的情况下,尝试切换到Perl,它允许您一次检查整个输入文件。
perl -n0777 -e 'while (m/export {([^{}]+)}/mg) { $s = $1;
print "$1n" while $s =~ m/b((?!somefunction|otherfunction)w+)b/mg }' src/index.ts
第一个正则表达式循环遍历export { ... }
表达式并取出括号之间的文本。第二个程序挑选出符号,跳过任何空格或标点符号,并打印它们。
负向前瞻说明如何从匹配中排除somefunction
或otherfunction
。