我有一个包含如下数据的文件:
ab001
ab002
ab003
ab004
我必须将以“ab”开头的所有单词替换为“ab001”,即更改后文件应如下所示
ab001
ab001
ab001
ab001
我%s/ab*/ab001/g
在VI
编辑器中尝试过,但没有给出预期的结果。我也尝试谷歌,但找不到任何解决方案。
答案1
既然你用这个标记了六最初询问有关 vi 的问题,我将向您解释为什么它在 vi 中不起作用,以及如何修复它。你说你最初尝试过:
%s/ab*/ab001/g
搜索的工作方式*
是匹配前一个原子 0 次或多次,尽可能多。从:h /*
:
*/star* */\star*
* (use \* when 'magic' is not set)
Matches 0 or more of the preceding atom, as many as possible.
在本例中,前一个原子是“b”,因此此搜索将匹配以下任意一个:
a
ab
abbb
abbbbbbbbbbbbbbbbbbb
它也会匹配ab001
,但它只匹配它的第一部分,所以匹配是(ab)001
。 Vi 发现您正在搜索此内容,并将其替换为(ab001)001
。解决方案很简单。你想要匹配
'ab' 后跟任意内容
点字符 ( .
) 将匹配除换行符之外的任何字符。所以如果你搜索
/ab.*/
它将匹配任何事物以“ab”开头。所以你要:
:%s/ab.*/ab001/g
如果匹配太多(例如,“绝对”之类的单词),您可以将其简化为仅查找数字。例如,这将匹配“ab”后跟任意数量的数字:
/ab\d*/
这将匹配“ab”后跟三位数字:
/ab\d\{3}/
我建议添加书签这一页快速 vi-regex 参考。我发现它对于排除某些正则表达式的故障非常有价值。
答案2
awk
您可以使用以下方法进行操作:
cat input_file | awk '{if($1~/^ab/){print "ab001"}else{print $0}}'
将awk
搜索文件的第一个字段是否以“ab”开头,并将使用该字符替换为“ab001” ^
,这意味着start of
您选择的字段,否则按原样打印记录。
答案3
我会尝试 perl oneliner
perl -i.bak -pe 's/\bab.*?\b/ab001/g;' [file(s)]
正则表达式查找单词边界上以“ab”开头的所有元素,并将其替换为“ab001”
我创建了这个文件:ab001
ab002
ab003
ab004
ab005 ac001
ad0032 ab006
这个 perl 脚本生成了以下输出:
ab001
ab001
ab001
ab001
ab001 ac001
ad0032 ab001
我想这就是你想要的。
我使用的其他选项最好通过链接中的 Perl 文档进行解释perlrun - 如何执行 Perl 解释器
答案4
你有没有尝试过
$ sed 's/ab\(.\+\)/ab001/g' -i file.txt
或者
$ sed 's/\(^ab\).*/ab001/g' -i file.txt
我想这是一种更简单、更好的方法,希望这就是您所寻找的。