通配符、正则表达式与 xargs 命令详解

键盘通配符

当查找文件时,不知道真正字符或不想键入完整名字时,命令又不支持正则表达式模块时,常常使用通配符代替一个或多个真正字符。
*             代替0个或多个字符。
?            匹配任何单个字符,且不能为空字符。
[]            匹配中括号内的任意一个字符。
 
通配符示例:
ls *.conf
ls /home/*.sh
ls h*.conf
ls test?.c
ls [abc]*

正则表达式——查找符合匹配的字符串。      

定位符
^              匹配字符串的开始,如^itcast,匹配以"itcast"开头的字符串
$               匹配字符串的结束,如itcast$,匹配以"itcast"结尾的字符串
\b              匹配单词的开始或结束,例如er\b 该表达式表示匹配er和空格之间的位置,如可以匹配"never"中的"er",但不能匹配"verb"中的"er"
\B              匹配非单词边界,与上面\b相反


确定范围符号(一般来说,编写正则表达式不要有空格,否则会被认为是要匹配一个空格,或者特殊字符被认为普通字符。)
.               匹配除换行符以外的任意字符
[]              一个方括号代表只匹配一个字符,注意[]内不要有空格,否则会被认为是要匹配一个空格。
[^]            反义,例如[^1234567890],匹配除数字以外任意字符。
|               这里代表‘或者’
-               连接范围,例如[a-zA-Z],任意一个存在26个字母里的字符都可以匹配,不区分大小写。
\               转义字符,将特殊字符转成普通字符
()              1、改变限定符范围,2、分组。

\s              匹配任何不可见字符,包括空格、制表符、换页符等等。

\S             匹配任何可见字符。

\t              匹配一个制表符。


限定符(重复次数)
*               重复零次或更多次
+              重复一次或更多次
?              重复零次或一次
{n}           重复n次
{n,}          重复n次或更多次
{n,m}       重复n到m次

shell特殊字符命令

<                   标准输入(stdio),将命令中接收输入的途径由默认的键盘更改为指定的文件,并删除以前的数据。
 
<<                 标准输入,将命令中接收输入的途径由默认的键盘更改为指定的文件,文件结尾加入内容,不会删除已有数据
 
>                   标准输出(stdout),将命令的执行结果输出到指定的文件中,并删除以前的数据。
 
>>                 标准输出,将命令执行的结果追加输出到指定文件,文件结尾加入内容,不会删除已有数据
 
2>                 标准错误(stderr),清空指定文件的内容,并将标准错误信息保存到该文件中
 
2>>               标准错误,将标准错误信息追加输出到指定的文件中
 
&>                 将标准错误的内容全部保存到指定的文件中。
注:箭头的指向就是数据的流向。
 
|                    管道(把前一个命令结果的输出交给后一个程序处理)。
/                    让一个有意义的字符转义成普通字符。
''                   单引号,不保留属性,全部当成普通字符。
""                  双引号,用于原本保留属性。
``                  反引号用于命令替换, ·· 中放可执行的命令,bash会将命令执行得的结果视为一个变量或变量列表。 
{}                  生产字符或数字序列,一般配合 echo 等命令使用,find命令里的{}意思是前面命令的结果。
(())               数值运算,用法灵活,效率高

xargs 是命令传递之间的一个参数过滤器,这意味着将包含换行和空白的输出通过管道交给 xargs 处理,用空格取代换行和空白,变成单行。

命令格式:somecommand |xargs -parameter command   

参数:

  • -p                          当每次执行一个分隔符(默认的xargs分隔符是空格)的时候询问一次用户。
  • -n num                  num为个数,表示命令在执行的时候一行用的分隔符的个数,默认是用所有的。
  • -t                           表示先打印,然后再执行。
  • -i                           一行一行赋值给 {},默认是单行。
  • -r                          当xargs的输入为空的时候则停止xargs,不用再去执行了。
  • -L num                 从标准输入一次读取 num 行送给 command 命令。
  • -l 同 -L。
  • -d delim               delim分隔符,这里修改的是xargs的分隔符。

python之re模块

                  pattern: 正则模型

                  repl:要替换的字符串或可执行对象
                  string : 要匹配的字符串
                  count : 指定替换个数,默认为0,表示每个匹配项都替换。
                  flags : 匹配模式,用于控制正则表达式的匹配方式

1、match(pattern, string, flags=0)

从字符串的开始根据正则模型匹配指定内容,匹配单个(只找一个)。

 

2、search(pattern, string, flags=0)

在字符串内根据正则模型匹配指定内容,匹配单个(只找一个),如果字符串没有匹配,则返回None。

 

3、group和groups

groups():表示从group(1)开始往后的所有值,组合成一个元组类型的值;
group():表示取全部匹配的字符串或者指定的组,返回结果是一个字符串;

   注意,如果匹配多次,只有最后一个匹配可以访问,如下代码:

1 m = re.match(r"(..)+", "a1b2c3") 
2 m.group(1) 
3 print m.group(1)

     m.group(1)的返回结果为"c3",而不是"a1"。

 

4、sub(pattern, repl, string, count=0, flags=0)

 re.sub用于替换字符串中的匹配项。                              

下面一个例子将字符串中的空格 ' ' 替换成 '-' :  

import re
text = "JGood is a handsome boy, he is cool, clever, and so on..."
print re.sub(r'\s+', '-', text)

re.sub还允许使用函数对匹配项的替换进行复杂的处理。如:re.sub(r'\s', lambda m: '[' + m.group(0) + ']', text, 0);将字符串中的空格' '替换为'[ ]'。

 

5、split(pattern, string, maxsplit=0, flags=0)

可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。

相当于以正则模型为基准,将匹配部分的左右两边字符串分割,并丢掉匹配部分;

如果在以正则模型部分加上"()"之后所切出的结果,会保留了匹配的项。

 

6、findall(pattern, string, flags=0)

  re.findall可以获取字符串中所有匹配的字符串。如:re.findall(r'\w*oo\w*', text);获取字符串中,包含'oo'的所有单词。

 

7、re.compile

  可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。下面是一个正则表达式对象的一个例子:

1
2
3
4
5
import re
text = "JGood is a handsome boy, he is cool, clever, and so on..."
regex = re.compile(r'\w*oo\w*')
print regex.findall(text)   #查找所有包含'oo'的单词
print regex.sub(lambda m: '[' + m.group(0+ ']', text) #将字符串中含有'oo'的单词用[]括起来。

 

使用chardet模块来判断数据的编码

#coding:utf-8
import chardet
f =open('hadoop.txt','r')     #打开文本文件,只读
about=f.read()         #读取文本内容
print cchardet.detect(about)       #判断字符串编码
#将字符串的原编码先转成unicode编码,再转成utf-8编码 print about.decode('gbk').encode('utf-8')

 

 
posted @ 2020-03-23 18:13  兰昌  阅读(4423)  评论(0)    收藏  举报