星期五, 四月 10, 2020

VIM学习笔记 替换字符串中的元字符(Metacharacters in Replacement Strings)

在替换和全局命令中, 某些元字符(metacharacters)在查找表达式和替换表达式中的含义是不同的。

例如以下命令,查找部分中的“.”因为有特殊意义,所有需要进行转义;而替换部分中的“.”和“$”则会被视为普通文本。

:%s/1\. Start/2. Next, start with $100/

1. Start   -------->   2. Next, start with $100

例如以下命令,会将“A”或“B”或“C”,分别替换为“[abc]”。也就是说,“[]”在替换部分也会被视为普通文本。

:%s/[ABC]/[abc]/g

ABC   -------->   [abc][abc][abc]

替换表达式中的元字符(Metacharacters)

元字符替换内容命令实例替换前替换后
\n\1-\9
查找表达式中由\(\)定义的第n个组
:%s/\(.*\) = \(.*\)/\2 = \1/x = yy = x
\l将下一个字符转换为小写:%s/Yes, Sir/\lYes, \lSir/Yes, Siryes, sir
\L将之后所有字符转换为小写:%s/Yes, Sir/\LYes, Sir/Yes, Siryes, sir
\u将下一个字符转换为大写:%s/yes, sir/\uyes, \usir/yes, sirYes, Sir
\U将之后所有字符转换为大写:%s/yes, sir/\Uyes, sir/yes, sirYES, SIR
\e结束\U和\L:%s/yes, sir/\Uyes, \esir/yes, sirYES, sir
\E:%s/yes, sir/\Uyes, \Esir/yes, sirYES, sir
\r换行符:%s/yes, sir/yes\rsiryes, siryes
sir
\转义符
将之后的特殊字符解释为普通文本
:%s/yes, sir/yes\\sir/yes, siryes\sir
&查找表达式所匹配的文本:%s/yes, sir/"&"/yes, sir"yes, sir"
~上一次替换命令中的替换文本:s/thier/their/thiertheir
:s/his/~/histhier

使用元字符交换文本位置

使用以下命令,可以交换以逗号分隔的列:

:%s/\([^,]*\),\([^,]*\),\(.*\)/\2,\1,\3/

Regex_Replacement_SwitchFields

查找表达式包括:

  • \([^,]*\),匹配除逗号之外的所有字符,即将第一列的内容捕获为组1;
  • \([^,]*\),匹配除逗号之外的所有字符,即将第二列的内容捕获为组2;
  • \(.*\),匹配剩余的所有字符,捕获为组3;

替换表达式包括:

  • \2,\1,\3,按照组2组1组3的顺序恢复各组的内容,即交换第二列与第一例的次序。

请注意,作为分隔符的逗号,在查找和替换部分均被视为普通文本。

假设需要将以下记录中的Name字段,转换为Firstname Lastname的形式:

Name: McFly, Susan S.; Areas: Graphics; Phone: 999-3333

可以使用以下命令,将逗号之前的Lastnmae捕获至组1,将分号之前的Firtname捕获至组2,然后再按照从组2到组1的顺序进行替换:

:%s/: \([^,]*\), \([^;]*\);/: \2 \1;/

Name: Susan S. McFly; Areas: Graphics; Phone: 999-3333

使用以下全局命令,则可以将替换操作限制在以“Name:”开头的行:

:g/^Name/s/: *\([^,]*\), \([^;]*\);/: \2 \1;/

使用元字符转换大小写

使用以下命令,将单词首字母转换为大写:

:%s/\<\(.\)\([^[:space:][:punct:]]*\)\>/\u\1\2/g

Regex_Replacement_TitleCase

查找表达式包括:

  • \<,匹配单词开头;
  • \(.\),匹配单词首字母,捕获为组1;
  • \([^[:space:][:punct:]]*\),匹配除空格和标点符号之外的字符串,即将单词首字母之外的其余部分捕获为组2;
  • \>,匹配单词末尾;

替换表达式包括:

  • \u,将下一个字符转换为大写;
  • \1,恢复捕获组1(即单词首字母)
  • \2,恢复捕获组2(即单词剩余部分)

使用以下命令,可以将匹配文本全部转换为大写:

:%s/Fortran/\U&/

fortran   -------->   FORTRAN

使用元字符进行精确替换

假设以下代码中rotine的名称以“test”为前缀,以“box”为后缀,而黄色高亮的中间部分则是可变的:

Regex_example_suffix_0

如果希望将后缀替换为“block”,那么可以将可变的字母作为捕获组进行替换:

:g/test\([abc]\)box/s//test\1block/g

Regex_example_suffix_1

假设需要将代码中“?dep=01”替换为:

{{path('index',{dep:01})}}

也就是说,只替换表达式的字符部分,但保留数字部分不变。可以使用(\d\d)捕获两位数字部分,然后在替换时使用\1来恢复数字:

:%s/?dep=\(\d\d\)/{{path('index',{dep:\1})}}/g

Ver: 2.0 | YYQ<上一篇 | 目录 下一篇>

没有评论:

发表评论