如何以逗号分隔的多行格式 grep 云函数?

How to grep cloud functions in a multiline format separated by comma?

我一直在尝试使用 grep/awk/sed 获取云函数,但是当前命令未获取以多行格式列出的云函数。

这是在运行时作为变量传递的当前命令:

deploy.sh

functions_list=$(grep 'export' src/index.ts | awk -F '[}{]' '{print }' | 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 }' | sed 's/^ *//; s/ *$//; /^$/d; s/,  /\n/g' | grep -v somefunction || echo '')

awk reads/scans 输入逐行;因此跳过 functionC、functionD 和 functionE,因为它们不属于提供的模式:

'[}{]' '{print }'

我添加了 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 = ;
  print "\n" while $s =~ m/\b((?!somefunction|otherfunction)\w+)\b/mg }' src/index.ts

第一个正则表达式遍历 export { ... } 表达式并提取大括号之间的文本。第二个选择符号,跳过任何空格或标点符号,然后打印它们。

否定前瞻说明了如何从匹配中排除 somefunctionotherfunction