我想摆脱遗留代码中存在的多余魔法字符串:
anchor: contentDefinitionHelper.toPatternFormField(
fields,
'anchor',
defaultFormFields,
attributeFields,
displayFields,
),
title: contentDefinitionHelper.toPatternTextFormField(
fields,
'brick_title',
defaultFormFields,
attributeFields,
displayFields,
),
descriptions: contentDefinitionHelper.toPatternTextsFormField(
fields,
'descriptions',
defaultFormFields,
attributeFields,
displayFields,
),
}
},
presenter: DescriptionsPatternPresenter,
technicalName: 'block_descriptions',
基本上在这里,我想收集anchor
,brick_title
和descriptions
,但我不想捕捉block_descriptions
。我想从grep或sed命令中执行此操作。
下面的正则表达式看起来是我想要的,当我在Rege101在线测试它:contentDefinitionHelper.toPattern.*Field(s+fields,s+('[^']+')
但是当我把它转换成grep命令时,什么也没有显示:
➜ grep -poE "contentDefinitionHelper.toPattern.*Field(s+fields,s+('[^']+')" src/admin/components/content-definition/patterns/descriptions/Descriptions.config.ts
➜
可能的输出:
anchor
brick_title
descriptions
编辑:我用的是MacOS。据我所知,grep和sed在这个系统上的工作方式不同。使用您显示的示例和尝试,请尝试遵循GNUawk
解决方案。在这里,我将RS值设置为contentDefinitionHelper[^n]*n([^n]*n){2}'
,以仅获得op所需的行。然后使用RT并将其值拆分为数组arr并获得所需的结果。
awk -v RS=' contentDefinitionHelper[^n]*n([^n]*n){2}' '
RT && num=split(RT,arr,ORS){
gsub(/^[[:space:]]+|,$/,"",arr[num-1])
print arr[num-1]
}
' Input_file
您可以尝试gnu grep
命令与G
:
set +H # disable history expansion
grep -zoP "(?:contentDefinitionHelper.w*|(?<!A)G)[^')]*K'[^'()]+'.*R" file |
tr -d "[',]"
anchor
brick_title
descriptions
关于regex
的更多细节请查看这个演示这可能适合您(GNU sed):
sed -nE '/contentDefinitionHelper/{:a;n;/^s*('''.*),.*/!ba;s//1/p}' file
匹配包含contentDefinitionHelper
的行和继续获取的行,直到以单引号开始并以逗号结束(忽略前导空格)的行,并打印非空白的结果。
UPDATE 1:muuuuuuch更简单的方法(或者如果您喜欢shell级别的双引号,可以节省更多字节):
gawk '!_<(NF *= !/:/)' OFS= FS='^[^47]+47|47.+$'
mawk '!_<(NF *= !/:/)' OFS= FS="^[^']+'|'.+$"
根本不需要捕获组
{m,g,n}awk 'NF *= /:/ < (!_<NF)' FS='^[^47]*47|47.*$' OFS=
or another similar approach
{m,g,n}awk 'NF *= 3 == NF' FS='^[^47]+47|(.*:|47).*$' OFS=
anchor
brick_title
descriptions