如何用grep或sed命令从regex打印捕获的组?



我想摆脱遗留代码中存在的多余魔法字符串:

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_titledescriptions,但我不想捕捉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

最新更新