【发布时间】:2017-03-13 12:57:02
【问题描述】:
我有一个包含 7 列的 CSV 文件,我有兴趣只修改第一列。事实上,在某些行中,行名以串联的方式出现 n 次,没有任何空格。我需要一个脚本来识别重复的开始位置并删除所有重复。
行名示例:
行名 = EXAMPLE1.ABC_DEF.panel4EXAMPLE1.ABC_DEF.panel4EXAMPLE1.ABC_DEF.panel4
替换为:EXAMPLE1.ABC_DEF.panel4
在不同的行中:
n 可以变化
行名的长度可以变化
行名的结构可以变化(例如,
_和.的数量),但它总是在没有任何空格的情况下进行排序
我尝试过的:
:%s/(.+)\1+/\1/
一步一步:
%s: 替换整个文件(.+)\1+:第一个捕获组。.+匹配任何字符(行终止符除外),+是量词——匹配一次到无限次,尽可能多次,根据需要返回。\1+:匹配第一个捕获组最近匹配的相同文本替换为
\1
但是,我收到以下错误:
E65:非法反向引用
E476:无效命令
【问题讨论】:
-
产生这些错误的工具是什么?您发布的命令与 sed 一起使用时符合您的预期:
sed -E 's/(.+)\1+/\1/' file -
@oliv 看起来像 vi/Vim?
-
你必须逃跑:
:%s/\(.\+\)\1\+/\1/ -
@BenjaminW。这是我的想法,并尝试过,但我只是没有收到这些错误......
-
@oliv 我得到了它们,未转义的
(),然后是未转义的+,但这可能取决于您使用的特定版本。