shell通配符

网友看法: (总结精辟!) 

通配符是系统level的 而正则表达式需要相关工具的支持: egrep, awk, vi, perl。

在文本过滤工具里,都是用正则表达式,比如像awk,sed等,是针对文件的内容的。
通配符多用在文件名上,比如查找find,ls,cp,等等。

 

 

通配符

     在您日常的 Linux 使用中,有很多时候您可能需要一次对多个文件系统对象执行单一操作(比如 rm)。在这些情况下,在命令行中输入许多文件通常让人感到厌烦:
$ rm file1 file2 file3 file4 file5 file6 file7 file8
为了解决这个问题,您可以利用 Linux 内置的通配符支持。这种支持也叫做“globbing”(由于历史原因),允许您通过使用通配符模式一次指定多个文件。Bash 和其它 Linux 命令将通过在磁盘上查找并找到任何与之匹配的文件来解释这种模式。因此,如果在当前工作目录中,您有从 file1 到 file8 的文件,那么您可以输入下面的命令来删除这些文件:
$ rm file[1-8]
或者,如果您只想要删除文件名以 file 开头的所有文件,您可以输入:
$ rm file*
或者,如果您想要列出 /etc 中以 g 开头的所有文件系统对象,您可以输入:
$ ls -d /etc/g*
/etc/gconf /etc/ggi /etc/gimp /etc/gnome /etc/gnome-vfs-mime-magic /etc/gpm /etc/group /etc/group-
现在,如果您指定了没有任何文件系统对象与之匹配的模式,会怎么样呢?在下面的示例中,我们试图列出 /usr/bin 中以 asdf 开头并且以 jkl 结尾的所有文件:
$ ls -d /usr/bin/asdf*jkl
ls: /usr/bin/asdf*jkl: No such file or directory
这里是对所发生情况的说明。通常,当我们指定一种模式时,该模式与底层系统上的一个或多个文件匹配,bash 以空格隔开的所有匹配对象的列表来替换该模式。但是,当模式不能找到匹配对象时,bash 将不理会参数、通配符等等,保留原样。因此,当“ls”不能找到文件 /usr/bin/asdf*jkl 时,它会报错。此处的有效的规则是:glob 模式只在与文件系统中的对象匹配时才可以进行扩展。

通配符语法:* 
* 将与零个或多个字符匹配。这就是说“什么都可以”。例子:
* /etc/g* 与 /etc 中以 g 开头的所有文件匹配。
* /tmp/my*1 与 /tmp 中以 my 开头,并且以 1 结尾的所有文件匹配。

通配符语法:? 
? 与任何单个字符匹配。例子:
* myfile? 与文件名为 myfile 后跟单个字符的任何文件匹配。
* /tmp/notes?txt 将与 /tmp/notes.txt 和 /tmp/notes_txt 都匹配,如果它们存在。

通配符语法:[] 
该通配符与 ? 相似,但允许指定得更确切。要使用该通配符,把您想要匹配的所有字符放在 [] 内。结果的表达式将与 [] 中任一字符相匹配。您也可以用 - 来指定范围,甚至还可以组合范围。例子:
* myfile[12] 将与 myfile1 和 myfile2 匹配。只要当前目录中至少有一个这样的文件存在,该通配符就可以进行扩展。
* [Cc]hange[Ll]og 将与 Changelog、ChangeLog、changeLog 以及 changelog 匹配。您可以看到,与大写形式的变形匹配时,使用括弧通配符很有用。
* ls /etc/[0-9]* 将列出 /etc 中以数字开头的所有文件。
* ls /tmp/[A-Za-z]* 将列出 /tmp 中以大写字母或小写字母开头的所有文件。

 

通配符语法:[!] 
除了不与括弧中的任何字符匹配外,[!] 构造与 [] 构造类似,只要不是列在 [! 和 ] 之间的字符,它将与任何字符匹配。例子:
  * rm myfile[!9] 将删除除 myfile9 之外的名为 myfile 加一个字符的所有文件。

通配符告诫说明 
这里有一些使用通配符时应该注意的告诫说明。由于 bash 对与通配符相关的字符(?、[、]、*)进行特别处理,因此您将包含这些字符的参数输入到命令中时,需要特别小心。例如,如果您想要创建一个包含字符串 [fo]* 的文件,下面这个命令可能不会执行您想要做的事:
$ echo [fo]* > /tmp/mynewfile.txt
如果 [fo]* 这个模式与当前工作目录中的任何文件匹配,那么您将在 /tmp/mynewfile.txt 内发现那些文件的名称,而不是您所期望的文字 [fo]*。解决方法是什么呢?嗯,一种方法是用单引号把这些字符括起来,这将告诉 bash 单纯地执行,而不会对其进行通配符扩展:
$ echo '[fo]*' > /tmp/mynewfile.txt
采用这种方法,您的新文件将包含所期望的文字的 [fo]*。另一种方法是,您可以使用反斜杠,告诉 bash [、] 和 * 应该被当成文字处理,而不是被当成通配符处理:
$ echo /[fo/].$' /etc/fstab
# /etc/fstab: static file system information.
在上面的示例中,我们用单引号将我们的正则表达式括起来以阻止 shell 解释 $ 。在不使用单引号的情况下,grep 甚至没有机会查看 $,$ 就从我们的正则表达式上消失了。

 


vim正则应用举例: 

:g/^/s*$/d 删除只有空白的行
:s//(/w/+/)/s/+/(/w/+/)//2/t/1 将 data1 data2 修改为 data2 data1
:%s//(/w/+/), /(/w/+/)//2 /1/ 将 Doe, John 修改为 John Doe
:%s=line(".") 将各行的 id 字符串替换为行号
:%s//(^//)//=(line(".")-10) .".". submatch(1) 
将每行开头的单词替换为(行号-10).单词的格式,如第11行的word替换成1. word
排序 :/OB/+1,$!sort

1,去掉所有的行尾空格:":%s//s/+$//"。"%"表示在整个文件范围内进行替换,"/s"表示空白字符(空格和制表符),"/+"对前面的字符匹配一次或多次(越多越好),"tiny_mce_markerquot;匹配行尾(使用"/$表示单纯的"$字符);被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。这个还是比较简单的。
2,去掉所有的空白行:":%s//(/s*/n/)/+//r/"。这回多了"/("、"/)"、"/n"、"/r"和 "*"。"*"代表对前面的字符(此处为"/s")匹配零次或多次(越多越好;使用"/.*!!"。首先可以注意到,这儿分隔符改用了"!",原因是在模式或字符串部分使用了"/"字符,不换用其他分隔符的话就得在每次使用"/"字符本身时写成"//",上面的命令得写成":%s//s*.*//",可读性较低。"."匹配表示除换行符之外的任何字符吧。
4,去掉所有的""注释:":%s!/s*//s*! !g"。"/_."匹配包含换行在内的所有字符;"/{-}"表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好;标志"g"表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像"intmain()"这样的表达式在替换之后仍然是合法的。

 

正则总结(转)    

 

元字符 说明 
. 匹配任意一个字符
[abc] 匹配方括号中的任意一个字符。可以使用-表示字符范围,
      如[a-z0-9]匹配小写字母和阿拉伯数字。
[^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
/d 匹配阿拉伯数字,等同于[0-9]。
/D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]。
/x 匹配十六进制数字,等同于[0-9A-Fa-f]。
/X 匹配十六进制数字,等同于[^0-9A-Fa-f]。
/w 匹配单词字母,等同于[0-9A-Za-z_]。
/W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。
/t 匹配字符。
/s 匹配空白字符,等同于[ /t]。
/S 匹配非空白字符,等同于[^ /t]。
/a 所有的字母字符. 等同于[a-zA-Z]
/l 小写字母 [a-z]
/L 非小写字母 [^a-z]
/u 大写字母 [A-Z]
/U 非大写字母 [^A-Z]
 
表示数量的元字符 
元字符 说明
* 匹配0-任意个
/+ 匹配1-任意个
/? 匹配0-1个
/{n,m} 匹配n-m个
/{n} 匹配n个
/{n,} 匹配n-任意个
/{,m} 匹配0-m个
/_. 匹配包含换行在内的所有字符
/{-} 表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好
/= 匹配一个可有可无的项
/_s 匹配空格或断行
/_[]
 
元字符 说明 
/* 匹配 * 字符。
/. 匹配 . 字符。
// 匹配 / 字符。
// 匹配 / 字符。
/[ 匹配 [ 字符。
 
表示位置的符号
 
$ 匹配行尾
^ 匹配行首
/< 匹配单词词首
/> 匹配单词词尾
 
替换变量
 
在正规表达式中使用 /( 和 /) 符号括起正规表达式,即可在后面使用/1、/2等变量来访问 /( 和 /) 中的内容。
 
懒惰模式
 
/{-n,m} 与/{n,m}一样,尽可能少次数地重复
/{-} 匹配它前面的项一次或0次, 尽可能地少
/| "或"操作符
/& 并列
  
函数式
 
:s/替换字符串//=函数式
在函数式中可以使用 submatch(1)、submatch(2) 等来引用 /1、/2 等的内容,而submatch(0)可以引用匹配的整个内容。
 
与Perl正则表达式的区别 ?
 
元字符的区别
Vim语法 Perl语法 含义
/+            1-任意个
/?            0-1个
/{n,m}   {n,m}   n-m个
/(和/)   (和)    分组

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值