使用 vim 选择单引号之间的所有字符串



我有以下文字:

select region_id, 'Males_Negative_Nil_income_Age_15_19_years' as category, Males_Negative_Nil_income_Age_15_19_years as number from income_mf_pivot 
union
select region_id, 'Males_Negative_Nil_income_Age_20_24_years' as category, Males_Negative_Nil_income_Age_20_24_years as number from income_mf_pivot
union
select region_id, 'Males_Negative_Nil_income_Age_25_34_years' as category, Males_Negative_Nil_income_Age_25_34_years as number from income_mf_pivot
union
select region_id, 'Males_Negative_Nil_income_Age_35_44_years' as category, Males_Negative_Nil_income_Age_35_44_years as number from income_mf_pivot

我想结束的(我假设通过选择)是

Males_Negative_Nil_income_Age_15_19_years,
Males_Negative_Nil_income_Age_20_24_years,
Males_Negative_Nil_income_Age_25_34_years,
Males_Negative_Nil_income_Age_35_44_years

我以为进行选择会像/g 这样的东西(使用它来选择两个 ' 之间的所有内容),然后以某种方式拉动它,但我已经失去了动力。

我不是一个纯粹主义者。 我不介意它是否不止一个命令。 我追求的是能够在整个文档上运行。

yi' 命令允许您在单引号之间拉动文本,但这一次仅适用于单个实例。

只要宽度相同(即您有一个矩形选择),您就可以使用块视觉模式,从<C-v>开始(通常在 Windows 上<C-q>)。

要获取单引号内的所有文本,您可以使用我的 ExtractMatches 插件。它提供以下命令:

:%YankMatchesToReg /'zs[^']+ze'/

之后,您只需p文本并添加尾随逗号即可。如果所有匹配项都应该在一行中,那么我的 UnconditionalPaste 插件中的g,p可以一举完成。

您可以将光标放在第一个 M 上,然后使用 CTRL-v 启动块视觉模式,移动到要用6je拉动的另一端,然后用y拉动它。虽然这确实拉动了空行,但它们一旦粘贴就应该很容易摆脱。

另一种方法(也会附加逗号)是使用外部过滤器,例如 sed

:r!sed -n "s/.*'(Males[^']*).*/1,/p" %

这导致

Males_Negative_Nil_income_Age_15_19_years,
Males_Negative_Nil_income_Age_20_24_years,
Males_Negative_Nil_income_Age_25_34_years,
Males_Negative_Nil_income_Age_35_44_years,

我假设每个目标行中正好有两个单引号,就像您的示例文本一样。

我会在可视模式下选择所需的行,然后使用 进入 Ex 模式。 将自动插入范围"<",">"(代表视觉对象选择)。 我会完成它

:'<,'>v/'.*'/d

(删除所有不包含两个 ' 字符的行)以删除"联合"行。 然后 gv 重新选择视觉对象选择,并完成命令行

:'<,'>s/^[^']*'|'.*//g
:'<,'>-s/$/,

或者,也许,而不是这两个命令,

:'<,'>s/.*'(.*)'.*/1,

然后从最后一行中删除

选择

Males_Negative_Nil_income_Age_15_19_years

select region_id, 'Males_Negative_Nil_income_Age_15_19_years' as category, Males_Negative_Nil_income_Age_15_19_years as number from income_mf_pivot 

使用vi'(选择内部单引号)

:help object-select阅读它吗

最新更新