根据前 n 个字符替换单词

根据前 n 个字符替换单词

我有一个包含如下数据的文件:

ab001

ab002

ab003

ab004

我必须将以“ab”开头的所有单词替换为“ab001”,即更改后文件应如下所示

ab001

ab001

ab001

ab001

%s/ab*/ab001/gVI编辑器中尝试过,但没有给出预期的结果。我也尝试谷歌,但找不到任何解决方案。

答案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

我想这是一种更简单、更好的方法,希望这就是您所寻找的。

相关内容