VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,倒数第二列, 匹配任意一个字符 :...

本文介绍了VIM中正则表达式的使用,包括批量替换文本、删除和移动行、非贪婪匹配、匹配竖线以及中文字符。内容涵盖正则表达式的元字符、替换规则、大小写转换、量词、环视和固化分组,以及与Perl正则表达式的差异。此外,还提供了多个VIM正则表达式的实战示例,如删除空行、处理行首行尾空格、替换注释等。
摘要由CSDN通过智能技术生成

VIM 用正则表达式 批量替换文本,多行删除,复制,移动

在VIM中 用正则表达式 批量替换文本,多行删除,复制,移动

:n1,n2 m n3     移动n1-n2行(包括n1,n2)到n3行之下;

:n1,n2 co n3    复制n1-n2行(包括n1,n2)到n3行之下;

:n1,n2 d        删除n1-n2行(包括n1,n2)行;

 

vi替换使用规则:
:g/s1/s/s2/s3/g

第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串
在vi界面下使用命令 :%s#/usr/bin#/bin#g 可以把文件中所有路径/usr/bin换成/bin。其中“#”是转义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。

 

s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:s/str1/str2/gi 用字符串 str2 替换行中所有出现的字符串 str1,在查找时不区分大小写

 

(本文出自php_sir的新浪博客,用户名php_sir,首页链接:http://blog.sina.com.cn/phpsir,未经本人(php_sir)同意禁止转载)


: .,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1

:1,$ s/^str1/str2/g 用字符串 str2 替换正文中所有出现的,每行以str1开头的字符串
:g/str1/s//str2/g 功能同上
:%s/str1/str2/g 功能同上
:g/foobar/s/bar/baz/g 首先搜寻foobar,然后把它变成foobaz. 它没有改变 jailbars, 而其他的一些命令可能会改变jailbars.
:%s/str1/str2/gc 替换全文所有符合的单词并让用户确认
:g/str1/s//str2/gi 用字符串 str2 替换正文中所有出现的字符串 str1,在查找时不区分大小写,此命令没有下面的严格,经测试显示,不能完全做到在查找时忽略大小写
:%s/str1/str2/gi 用字符串 str2 替换正文中所有出现的字符串 str1,在查找时不区分大小写,在查找时可以完全做到忽略大小写
:10,20s/^/ / 将第10行至第20行资料的最前面插入5个空白
:%s/$/str/g 在整个文件每一行的行尾添加“str”
:3,7s/str1/str2/g仅替换文件中的第3行到第7行中的“str1”成“str2”
:%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分(前提是已经打开了/etc/passwd文件)

 

从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串在光标所在行的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。上面的命令中的/只是起分隔作用,也可以用其他的字符代替。另外,可以在正规式里用\ (和\)来剥离一个序列。

 

例如:有些字符域使用得很频繁. Vim 为这些字符域提供了预定义域:
项 匹配 相当于
\d 数字 [0-9]
\D 非数字 [^0-9]
\x 十六进制数字 [0-9a-fA-F]
\X 非十六进制数字 [^0-9a-fA-F]
\s 空白字符 [ ] ( 和 )
\S 非空白字符 [^ ] (非 和 )
\l 小写字母 [a-z]
\L 非小写字母 [^a-z]
\u 大写字母 [A-Z]
\U 非大写字母 [^A-Z]
& 所有查找时匹配到的东西
\[Ee] 更改大小写的选择区域的终点

:%s/\s\+$// 删除行尾多余的空格

命令前面指明范围是“%”,所以这会作用于整个文件。“substitute”命令的样式是“\s\+$”。这表示行末($)一个或者多个(\+)空格(\s)。:g/\(foo\)\(bar\)/s/\2/\1baz/g 将foobar替换成foobaz

www.qdtianquan.com

:0,$d   删除所有内容
:%s/r//g 删除DOS方式的回车^M
:%s= *$== 删除行尾空白
:%s/^(.*)n1/1$/ 删除重复行
:%s/^.{-}pdf/new.pdf/ 只是删除第一个pdf
:%s/// 又是删除多行注释(咦?为什么要说「又」呢?)
:g/s*^$/d 删除所有空行 :这个好用有没有人用过还有其他的方法吗?
:g!/^dd/d 删除不含字符串'dd'的行
:v/^dd/d 同上 (译释:v == g!,就是不匹配!)
:g/str1/,/str2/d 删除所有第一个含str1到第一个含str2之间的行
:v/./.,/./-1join 压缩空行
:g/^$/,/./-j 压缩空行
ndw 或 ndW 删除光标处开始及其后的 n-1 个字符。
d0 删至行首。
d$ 删至行尾。
ndd 删除当前行及其后 n-1 行。
x 或 X 删除一个字符。
Ctrl+u 删除输入方式下所输入的文本。
^R 恢复u的操作
J 把下一行合并到当前行尾
V 选择一行
^V 按下^V后即可进行矩形的选择了
aw 选择单词
iw 内部单词(无空格)
as 选择句子
is 选择句子(无空格)
ap 选择段落
ip 选择段落(无空格)
D 删除到行尾
x,y 删除与复制包含高亮区
dl 删除当前字符(与x命令功能相同)
d0 删除到某一行的开始位置
d^ 删除到某一行的第一个字符位置(不包括空格或TAB字符)
dw 删除到某个单词的结尾位置
d3w 删除到第三个单词的结尾位置
db 删除到某个单词的开始位置
dW 删除到某个以空格作为分隔符的单词的结尾位置
dB 删除到某个以空格作为分隔符的单词的开始位置
d7B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d) 删除到某个段落的结尾位置
d{ 删除到某个段落的开始位置
d7{ 删除到当前段落起始位置之前的第7个段落位置
dd 删除当前行
d/text 删除从文本中出现“text”中所指定字样的位置,
一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容
dfc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容
dtc 删除当前行直到下一个字符“c”所出现位置之间的内容
D 删除到某一行的结尾
d$ 删除到某一行的结尾
5dd 删除从当前行所开始的5行内容
dL 删除直到屏幕上最后一行的内容
dH 删除直到屏幕上第一行的内容
dG 删除直到工作缓存区结尾的内容
d1G 删除直到工作缓存区开始的内容

 

 

      如何在Vim的正则表达式替换中使用字母大小写转换?

      比如有下面这段文字:

      every day

      想将两个单词都转变为全大写,可以类似下面的vim最下行命令:

Vim代码   收藏代码
  1. :s/\(.*\) \(.*\)/\U\1 \2/  

      转变结果为:

      EVERY DAY

     

      相关的转义序列还有'\u','\L','\l'。

      '\u'表示只将首字母大写;而'\L','\l'的含义是与'\U','\u'相反的。


      下面的blog中包含了与上面相似的内容:

      Vim中的正则表达式

      不过要注意,此blog中在实验时是使用了模式分组来做的。上面的四个转义序列将在其被显式停止前,对跟在其后的内容持续作用;如果要停止,需要使用'\e'来中断。

       比如想将上面的文字转变为:

      EVERY day

      则需要使用类似下面的方式:

Vim代码   收藏代码
  1. :s/\(.*\) \(.*\)/\U\1\e \2/  
 

 

Vim用正则表达式进行批量修改

分类: Linux

vim可以设置 magic 这个东西, magic就是设置哪些元字符要加反斜杠哪些不用加的。 简单来说:

magic(\m):除了 $ . * ^ 之外其他元字符都要加反斜杠。

nomagic(\M):除了 $ ^ 之外其他元字符都要加反斜杠。

这个设置也可以在正则表达式中通过 \m \M 开关临时切换。 \m 后面的正则表达式会按照 magic 处理,\M 后面的正则表达式按照 nomagic 处理, 而忽略实际的magic设置。
/\m.*          # 查找任意字符串
/\M.*          # 查找字符串 .* (点号后面跟个星号)


另外还有更强大的 \v 和 \V。 * \v(即 very magic 之意):任何元字符都不用加反斜杠 * \V(即 very nomagic 之意):任何元字符都必须加反斜杠
例如:
/\v(a.c){3}$   # 查找行尾的abcaccadc
/\m(a.c){3}$   # 查找行尾的(abc){3}
/\M(a.c){3}$   # 查找行尾的(a.c){3}
/\V(a.c){3}$   # 查找任意位置的(a.c){3}$

默认设置是 magic,vim也推荐大家都使用magic的设置


在正规表达式中使用 /( 和 /) 符号括起正规表达式,即可在后面使用/1 、/2 等变量来访问 /( 和 /) 中的内容。


有了以上内容,我们可以完成一个常用的的替换功能了:

这个是查找if(mRequest[“name”]这样的模式,然后替换成if(mRequest.find("name")

:s/\vif\(mrequest\[(.*)\]/if\(mRequest.find(\$1)/g


上述命令只会替换一行,如果要替换从第5行到底105行,则为:

:5,105s/\vif\(mrequest\[(.*)\]/if\(mRequest.find(\$1)/g

或者全文替换:

:%s/\t/  /gc


c的意思是让你确认,y是确认一个,a是确认所有的。


 

 

 

Vim正则表达式

一、对应《正则表达式30分钟入门教程

deerchao的《正则表达式30分钟入门教程》我读过好几遍,可以说是极好的学习正则表达式的入门文章。我常用的文本编辑器是Vim,具有强大的查找功能。不过,Vim的表示方式和《正则表达式30分钟入门教程》有些不同。这遍文章对应教程,把不同部分列出来,作为备份。
说明:相同的就不列出来了。

序号

入门教程

Vim

备注

1

\b是正则表达式规定的一个特殊代码……代表着单词的开头或结尾,也就是单词的分界处

没有直接对应的。
\<,表示单词的起始;
\>,表示单词的结

要查找单词hi,要用 \

2

+则匹配重复1次或更多次

\{1,} 1 或更多,同 \+

\d+匹配1个或更多连续的数字,Vim用 \d\+ (匹配连续几个数字)

3

? 重复零次或一次

\{0,1}   0 或 1,同 \=


4

\(?0\d{2}[) -]?\d{8}
这个表达式可以匹配几种格式的电话号码

\(\=0\d\{2}[) -]\=\d\{8}


5

如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开

在一个查找模式中,"或" 运算符是 "\|"


6

\b(\w+)\b\s+\1\b
可以用来匹配重复的单词

\<\(\w\+\)\s\+\1\>


7

\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分)

\<\w\+\(ing\)\@=

Vim称为:零宽度匹配前面的匹配原

8

(?<=\bre)\w+\b 会匹配以re开头的单词的后半部分(除了re以外的部分)

\(\

零宽度反向匹配。要求前面的匹配原紧贴在后面的模式之前匹配

9

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)
((?<=\d)\d{3})+\b

\(\(\d\)\@<=\d\{3}\)\+\>


10

(?<=\s)\d+(?=\s)匹配以空白符间隔的数字

\(\s\)\@<=\d\+\(\s\)\@=


11

匹配包含后面不是字母u的字母q的单词

\b\w*q(?!u)\w*\b

\<\w*q\(u\)\@!\w*\>

零宽度否匹配,亦即,要求前面的匹配原在当前位置_不_匹配

12

\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字

\d\{3}\(\d\)\@!


13

\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词

\<\(\(\(abc\)\@!\)\w\)\+\>


14

(?

\([a-z]\)\@

零宽度反向否匹配,要求前面的匹配原_不_紧贴在其后的模式之前匹配

15

(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容

\(<\3>\)\@<=.*\(<\/\(\w\+\)>\)\@=


表达式写出来 了,验证可用,但不明白为什么是\3。



二、其它实例

实例1: 密码验证:由且仅由数字、字母(大小写)组成,两者缺一不可,密码不少于6位。
正则表达式: ^\(.*\d\)\@=\(.*[a-z]\)\@=[a-z0-9]\{6,}$

实例2: 十位的数字、字母组合密码,其中包含4位数字和6位字母。
正则表达式: ^\(.*\d.*\d.*\d.*\d.*\)\@=\(.*[a-z].*[a-z].*[a-z].*[a-z].*[a-z].*[a-z].*\)\@=[a-z0-9]\{10}$

注:这两个例子来自《两条与密码验证相关的正则表达式问题》 实例3:把[a]替换为[a]
正则表达式:%s/\(^.*\)/\1<\/A>/g

实例4:把[a 1]替换为[1]

注:[a 1]] 中,a、1之间是tab。
正则表达式:%s/\(^.\{-}\)\t\(.\{-}$\)/\2<\/A>/g
%s/\(^.\{-}\)\t\(.*\)/
\2<\/A>/g

实例五:匹配所有汉字

我无法做到,只能通过迂回的方式来达到。

正则表达式:[^\x00-\x7f]\+

表示非ASCII码的集合,包括汉字。

 

 

:%s/\([a-z]\)\ \([\u4e00-\u9fa5].\+\)$/\1\t\2/g

. 匹配任意一个字符

awk中倒数第二列: cat 1-iplist.txt | awk '{ print $(NF-2) }'|wc

\v[\u4e00-\u9fa5]+ " 匹配中文

 

 

 

 

 

 

 

vim的正则表达式(一)

分类: vim

目录(?)[+]




本文出自   http://blog.csdn.net/shuangde800

------------------------------------------------------------------------------------------------


本文是在学习《使用vi编辑器, Lamb & Robbins编著》时在所记的笔记。

 
本文内容:
模式匹配规则(正则表达式)
元字符
模式匹配举例


本文约定:
$ + 命令 表示在普通的bash的命令行下
:  + 命令 表示在vim的ex(命令)模式, 按"Ctrl" + ":" 进入

------------------------------------------------------------------------------------------------

 



搜索模式的元字符


进行全局替换时,不仅可以使用固定的字符串,还允许是搜索由正则表达式指代的可变的单词模式。

当你指定一个字面的字符串时,搜索可能会找到不想匹配的其他实例。
例如,在文件搜索单词时,单词可以有不同的使用方式。正则表达式有助于在上下文中搜索单词。要注意正则表达式可以与vi的搜索命令/,?以及ex中的:g,:s命令一起使用。

正则表达式由普通字符和许多称为元字符的专用字符结合在一起组成,元字符及其使用方法如下所示。 

 


元字符 用法
 .(点)
匹配除换行符之外的任何一个单个字符。空格也将作为字符。
例如p.p可以匹配pep,pip和pcp.
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值