精华内容
下载资源
问答
  • 正则表达式替换字符
    千次阅读
    2019-01-25 19:37:27

    1.Ctrl+R调出“替换对话框”
    2.在左下角的“正则表达式”和“从文件顶部全部替换”都打勾(正则表达式引擎用UltraEdit)
    3.在“查找内容”后面输入:*select*^p
    4.在“替换为”后面置空
    5.点击右侧的“全部替换”

    但是注意这里的^p只是在unix编码格式中,dos编码格式时要用^n。
    UE的DOS格式:
    纯文本文件(不包括MAC格式)一般有两种,一种表示行末的是一个“回车+换行”也就是“\r\n”组合,另一种呢,则只有换行,也就是“\n”,这两种格式,一种是DOS格式,另一种一般是Unix系统使用的,所谓转换成DOS格式就是指这种转换了。

    下面解释下ultraedit正则表达式:
    首先,在UE中需要用户按键到“高级”-“配置”-“搜索”-“正则表达式引擎”中进行使用哪一种正则表达式的选择。如图

    如果你选中“UltraEdit风格正则表达式”,在以后的搜索和替换功能中就将使用“UltraEdit风格正则表达式”的语法规则来进行操作,其它同理。
    现在的版本里面,还加入了“Perl 兼容正则表达式”,在以后的文章中还有提到。

    符号 功能

    • % 匹配行的开始 - 显示搜索字符串必须在行的开始,但是在所选择的结果字符串中不包括任何行终止字符。
    • $ 匹配行尾 - 显示搜索字符串必须在行尾,但是在所选择的结果字符串中不包括任何行终止字符。
    • ? 除了换行符以外匹配任何单个的字符
    • * 除了换行符匹配任何数量的字符和数字
    • + 前一字符匹配一个或多个,但至少要出现一个
    • ++ 前一字符匹配零个或多个,但至少要出现一个
    • ^b 匹配一个分页
    • ^p 匹配一个换行符(CR/LF)(段)(DOS文件)
    • ^r 匹配一个换行符(CR 仅仅)(段)(MAC 文件)
    • ^n 匹配一个换行符 ( LF 仅仅 )( 段 )( UNIX 文件 )
    • ^t 匹配一个标签字符TAB
    • [] 匹配任何单个的字符,或在方括号中的范围
    • ^{A^}^{ B^} 匹配表达式A或 B
    • ^ 重载其后的正规表达式字符
    • ^(^) 括或标注为用于替换命令的表达式。

    一个正则表达式最多可以有9个标注表达式, 按正规表达式的需要而定。
    相应的替换表达式是 ^x , 替换范围x是1-9。例如:
    If ^(h*o^) ^(f*s^) matches "hello folks",
    ^2 ^1 would replace it with "folks hello".

    (hello folks 将被替换成 folks hello。)

    注: ^ 是实际字符 ^不是Ctl + 键值。

    例如:
    m?n 匹配 "man","men","min" 但不匹配 "moon".
    t*t 匹配 "test","tonight" 和 "tea time" (the "tea t" portion) 但不匹配 "tea
    time" (newline between "tea " and "time").
    Te+st 匹配 "test","teest"," teeeest "等等。但是不匹配 "tst"。
    [aeiou] 匹配每个小写元音。
    [,.?] 匹配一文字的 ",","."或 "?"。
    [0-9, a-z] 匹配任何数位,或小写字母。
    [~0-9] 除了数字以外匹配任何字符 (~ 意味着"不")

    你按如下方式可以查找一个表达式A或 B :

    "^{John^}^{Tom^}"

    这将在找John或Tom的出现。应该在 2 个表达式之间没有任何东西。

    你可以在同一搜索中按如下方式组合A or B and C or D:

    "^{John^}^{Tom^}^{Smith^}^{Jones^}"

    这将在John or Tom 后面找 Smith or Jones。

    下表为"Unix"句法类型的正则表达式。

    正则表达式 (Unix句法):

    符号 功能
    标记下一个字符作为一个特殊的字符。

    • "n" 匹配字符"n"。"n" 一个换行符或换行符字符。
    • ^ 匹配/定位行的开始。
    • $ 匹配/定位行的尾。
    • * 匹配前面的字符零次或多次。例
    • + 匹配前面的字符一次或多次。例
    • . 匹配除了一个换行符字符匹配任何单个的字符。
    • (expression)标注用于替换命令的表达式。一个正则表达式根据需要,最多可以有9个标注表达式。相应的代替表达式是 x , x的范围是 1-9 。


    例如:

    If (h.*o) (f.*s) matches "hello folks",
    2 1 would replace it with "folks hello".
    (hello folks 将被替换成 folks hello。)

    • [xyz] 一个字符集。匹配在方括号之间的任何字符。
    • [^xyz] 一个否定的字符集。不匹配在方括号之间的任何字符。
    • d 匹配一个数字字符。等价于[0-9]。
    • D 匹配一个非数字字符。等价于[^0-9]。
    • f 匹配一个换页字符。
    • n 匹配一个换行字符。
    • r 匹配一个回车符字符。
    • s 匹配任何空白的空格, 标签, 换页, 包括空格等等,但不匹配换行符。
    • S 匹配任何非空白的字符,但不匹配换行符。
    • t 匹配一个标签TAB字符。
    • v 匹配一个垂直的标签字符。
    • w 匹配任何词语字符包括下划线。
    • W 匹配任何非词语字符字符。

    注: ^ 是实际字符 ^不是Ctl + 键值。

    例如:
    m.n 匹配 "man","men","min" 但不匹配 "moon".
    t+t 匹配 "test","tonight" 和 "tea time" (the "tea t" portion) 但不匹配 "tea
    time" (newline between "tea " and "time").
    Te*st 匹配 "test","teest"," teeeest "等等。但是不匹配 "tst"。
    [aeiou] 匹配每个小写元音。
    [,.?] 匹配一文字的 ",","."或 "?"。
    [0-9,a-z] 匹配任何数位,或小写字母。
    [^0-9] 除了数字以外匹配任何字符 (~ 意味着"不")

    你按如下方式可以查找一个表达式A或 B :

    "(John)|(Tom)"

    这将在找John或Tom的出现。应该在 2 个表达式之间没有任何东西。

    你可以在同一搜索中按如下方式组合A or B and C or D:

    "(John|Tom) (Smith|Jones)"

    这将在John or Tom 后面找 Smith or Jones。

    另外:

    p 匹配 CR/LF ( 作为 rn 的一样 ) 作为DOS行结束符匹配

    如果查找/替换功能中正则表达式没有选用,则替换字段中下列字符也是有效的:

    符号 功能

    • ^^ 匹配一个 "^" 字符
    • ^s 替换为被选择 ( 加亮 ) 活跃的文件窗口的文章。
    • ^c 替换为剪贴板的内容
    • ^b 匹配一个页裂缝
    • ^p 匹配一个换行符 ( CR/LF )( 段 )( DOS 文件)
    • ^r 匹配一个换行符 ( CR 仅仅 )( 段 )( MAC 文件)
    • ^n 匹配一个换行符 ( LF 仅仅 )( 段 )( UNIX 文件)
    • ^t 匹配一个标签TAB字符
    更多相关内容
  • Findstr使用正则表达式搜索文件中的文本模式。
  • 批处理 正则表达式(findstr) 整理语法findstr [/b] [/e] [/l] [/r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/p] [/offline] [/g:File] [/f:File] [/c:String] [/d:DirList] [/a:ColorAttribute] [Strings] [[Drive:]...

    批处理 正则表达式(findstr) 整理

    语法

    findstr [/b] [/e] [/l] [/r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/p] [/offline] [/g:File] [/f:File] [/c:String] [/d:DirList] [/a:ColorAttribute] [Strings] [[Drive:][Path] FileName [...]]

    参数

    /b

    如果位于行的开头则匹配模式。

    /e

    如果位于行的末尾则匹配模式。

    /l

    逐字地搜索字符串。

    /r

    使用搜索串作为正则表达式。Findstr 将所有元字符解释为正则表达式,除非使用了 /l。

    /s

    在当前目录和所有子目录中搜索匹配的文件。

    /i

    指定搜索不区分大小写。

    /x

    打印完全匹配的行。

    /v

    仅打印不包含匹配的行。

    /n

    在每个匹配的行之前打印行号。

    /m

    如果文件包含匹配项,则仅打印该文件名。

    /o

    在每个匹配行之前打印查找偏移量。

    /p

    跳过包含非可打印字符的文件。

    /offline

    利用脱机属性设置处理文件。

    /f:File

    从指定文件中读取文件列表。

    /c:String

    使用指定的文本作为文字搜索字符串。

    /g:File

    从指定文件得到搜索字符串。

    /d:DirList

    搜索以逗号分隔的目录列表。

    /a:ColorAttribute

    使用两个十六进制数指定颜色属性。

    Strings

    指定要在 FileName 中搜索的文本。

    [ Drive:][Path] FileName [...]

    指定要搜索的文件。

    /?

    在命令提示符下显示帮助。

    注释

    • 使用 Strings 和 [Drive:][Path] FileName [...]

    在命令字符串中,所有 findstr 命令行选项必须在 Strings 和 [Drive:][Path] FileName [...] 之前。

    • 在 findstr 中使用正则表达式

    Findstr 可以在任何 ASCII 文件或文件中精确查找所要查找的文本。然而,有时要匹配的信息只有一部分或要查找更宽广的信息范围。在这种情况下,findstr 具有使用正则表达式搜索各种文本的强大功能。

    正则表达式是用于指定文本类型的符号,与精确的字符串相反。标记使用文字字符和元字符。每个在常规的表达式语法中没有特殊意义的字符都是文字字符,与出现的该字符匹配。例如,字母和数字是文字符号。元字符是在正则表达式语法中具有特殊意义(操作符或分隔符)的符号。

    下表列出 findstr 接受的元字符。

    字符 值

    .

    通配符:任何字符

    *

    重复:以前零次或多次出现的字符或类

    ^

    行中的位置:行首

    $

    行中的位置:行尾

    [class]

    字符类:集中的任何一个字符

    [^class]

    反向类:非集中的任何一个字符

    [X-y]

    范围:指定范围内的任何字符

    \X

    转义:元字符 X 的文字用途

    \ 字的位置:字首

    xyz\>

    字的位置:字尾

    组合使用正则表达式语法的特殊字符功能十分强大。例如,下面的通配符 (.) 和重复符 (*) 的组合可以匹配任何字符串:

    .*

    将如下表达式用作匹配以“b”开头并以“ing”结尾的任意字符串的更大表达式的组成部分:

    b.*ing

    示例

    使用空格分隔多个搜索字符串,除非参数以 /c 为前缀。要在文件 x.y 中搜索“hello”或“there”,请键入:

    findstr "hello there" x.y

    要在文件 x.y 中搜索“hello there”,请键入:

    findstr /c:"hello there" x.y

    若要查找文件 Proposal.txt 中出现的所有单词“Windows”(首字母 W 大写),请键入:

    findstr Windows proposal.txt

    若要搜索包含单词 Windows 的当前目录和所有子目录中的每个文件(不考虑字母大小写),请键入:

    findstr /s /i Windows *.*

    要查找包含字“FOR”的所有行(前面可有任意空格,如:计算机程序中的循环),并包括每次出现的行号,请键入:

    findstr /b /n /c:"*FOR" *.bas

    如 果要在相同组文件中搜索几个不同项目,请在新行上创建包含每个搜索标准的文本文件。也可以列出要在文本文件中搜索的确切文件。要使用文件 Finddata.txt 中的搜索标准来搜索 Filelist.txt 中列出的文件,然后将结果保存到文件 Results.out 中,请键入:

    findstr /g:finddata.txt /f:filelist.txt > results.out

    假设您想要查找当前目录和所有子目录中包含单词“computer”的每个文件,而不考虑字母的大小写。若要列出包含单词“computer”的所有文件,请键入:

    findstr /s /i /m "\" *.*

    现在假定不仅需要查找单词“computer”,而且需要查找以字母“comp”开头的所有其他单词,例如“compliment”和“compete”。请键入:

    findstr /s /i /m "\

    http://www.microsoft.com/technet/prodtechnol/windowsserver2003/zh-chs/library/ServerHelp/2b01d7f5-ab5a-407f-b5ec-f46248289db9.mspx?mfr=true

    实例:

    1.findstr . 2.txt 或 findstr "." 2.txt

    从文件2.txt中查找任意字符,不包括空字符或空行

    ====================

    2.findstr .* 2.txt 或 findstr ".*" 2.txt

    从文件2.txt中查找任意字符包括空行和空字符

    ====================

    3.findstr "[0-9]" 2.txt

    从文件2.txt中查找包括数字0-9的字符串或行

    ====================

    4.findstr "[a-zA-Z]" 2.txt

    从文件2.txt中查找包括任意字符的字符串或行

    ====================

    5.findstr "[abcezy]" 2.txt

    从文件2.txt中查找包括a b c e z y字母的字符串或行

    ====================

    6.findstr "[a-fl-z]" 2.txt

    从文件2.txt中查找小写字符a-f l-z的字符串,但不包含g h I j k这几个字母。

    ====================

    7.findstr "M[abc][hig]Y" 2.txt

    从文件2.txt中可以匹配 MahY , MbiY, MahY等…..

    ====================

    8. ^和$符号的应用

    ^ 表示行首,"^step"仅匹配 "step hello world"中的第一个单词

    $ 表示行尾,"step$"仅匹配 "hello world step"中最后一个单词

    ====================

    9.finstr "[^0-9]" 2.txt

    如果是纯数字的字符串或者行便过滤掉,例如2323423423 这样的字符串,如果是345hh888这样的形式就不成了。

    ====================

    10.findstr "[^a-z]" 2.txt

    同上,如果是纯字母的字符串或者行便过滤掉,例如 sdlfjlkjlksjdklfjlskdf这样的字符,如果是sdfksjdkf99999这样的形式,掺杂着数字就不成了

    ====================

    11.*号的作用

    前面已经说过了 ".*"表示搜索的条件是任意字符,*号在正则表达式中的作用不是任何字符,而是表示左侧字符或者表达式的重复次数,*号表示重复的次数为零次或者多次。

    ====================

    12.findstr "^[0-9]*$" 2.txt

    这个是匹配找到的纯数字,例如 234234234234,如果是2133234kkjl234就被过滤掉了。

    Findstr "^[a-z]*$" 2.txt

    这个是匹配找到的纯字母,例如 sdfsdfsdfsdf,如果是213sldjfkljsdlk就被过滤掉了

    如 果在搜索条件里没有*号,也就是说不重复左侧的搜索条件,也就是[0-9] [a-z]那只能匹配字符串的第一个字符也只有这一个字符,因为有行首和行尾的限制,"^[0-9]$"第一个字符如果是数字就匹配,如果不是就过滤掉, 如果字符串是 9 就匹配,如果是98或者9j之类的就不可以了。

    =====================

    13. "\"这个表达式的作用

    这个表示精确查找一个字符串,\表示字的结束位置

    echo hello world computer|findstr "\"这样的形式

    echo hello worldcomputer|findstr "\" 这样的形式就不成了,他要找的是 "computer"这个字符串,所以不可以。

    echo hello worldcomputer|findstr ".*computer\>"这样就可以匹配了

    =====================相关阅读:

    asp.net 特定目录form验证

    php skymvc 一款轻量、简单的php

    iframe的onload在Chrome/Opera中执行两次Bug的解决方法

    Oracle数据导入导出imp/exp

    用vbs计算某个词在日志文件中的出现次数

    配置IIS服务器时需要注意的地方

    Access在调整工资上的应用

    给初学PHP的5个入手程序

    文件夹定时自动备份 AutoBackUpFolder.vbs

    为IE8提供即时听歌小工具

    Number对象常用的toFixed()方法

    别人整理的服务器变量:$_SERVER

    PHP中将字符串转化为整数(int) intval() printf() 性能测试

    让XP系统极速狂飙 屏蔽五项网络功能

    展开全文
  • 计算机程序编辑中广泛使用的正则表达式技术,因其强大的文本批处理能力,被逐渐应用于语料库开发和复杂检索等相关技术中。本文的研究目的在于厘清正则表达式的起源、概念和构造,并以任务驱动的方法,以几款常用的语料库...
  • 支持日期、序号、正则表达式、替换、删除、大小写转换等 NameChanger Mac是mac平台上的一款专为解决大批量修改文件名的的文件名称批量修改软件。它可以一次性将大量的图片、文件修改文你所需要的名称,并搭配适当的...
  • 1.用 import re 导入正则表达式模块。 2.用 re.compile()函数创建一个 Regex 对象(记得使用原始字符串)。 3.向 Regex 对象的 search()方法传入想查找的字符串。它返回一个 Match 对象。 4.调用 Match 对象的 ...

    1.用 import re 导入正则表达式模块。
    2.用 re.compile()函数创建一个 Regex 对象(记得使用原始字符串)。
    3.向 Regex 对象的 search()方法传入想查找的字符串。它返回一个 Match 对象。
    4.调用 Match 对象的 group()方法,返回实际匹配文本的字符串。

    >>> import re
    >>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
    >>> mo = phoneNumRegex.search('My number is 415-555-4242.')
    >>> print('Phone number found: ' + mo.group())
    Phone number found: 415-555-4242
    

    第1行:导入re模块
    第2行:向 re.compile()传入一个字符串值,表示正则表达式,它将返回一个 Regex 模式对象,存储在变量phoneNumRegex中。(\d 表示“一个数字字符”,\d\d\d-\d\d\d-\d\d\d\d 是正确电话号码模式的正则表达式)
    第3行:Regex 对象的 search()方法查找传入的字符串,寻找该正则表达式的所有匹配。如果字符串中没有找到该正则表达式模式,search()方法将返回None。如果找到了该模式, search()方法将返回一个Match对象。
    第4行:Match 对象有一个group()方法,它返回被查找字 符串中实际匹配的文本。

    用正则表达式匹配更多模式

    1) 利用括号分组

    添加括号将在正则表达式中创建“分组”: (\d\d\d)-(\d\d\d-\d\d\d\d)。然后可以使用 group()匹配对象方法,从一个分组中获取匹配的文本。

    >>> import re
    >>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)') 
    >>> mo = phoneNumRegex.search('My number is 415-555-4242.') 
    >>> mo.group(1) 
    '415'
    >>> mo.group(2) 
    '555-4242' 
    >>> mo.group(0) 
    '415-555-4242' 
    >>> mo.group() 
    '415-555-4242' 
    >>> mo.groups() 
    ('415', '555-4242') 
    >>> areaCode, mainNumber = mo.groups() 
    >>> print(areaCode) 
    415 
    >>> print(mainNumber) 
    555-4242
    

    括号在正则表达式中有特殊的含义,但是如果你需要在文本中匹配括号,在这种情况下,就需要用倒斜杠对‘(’和‘)’进行字符转义。

    >>> phoneNumRegex = re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)') 
    >>> mo = phoneNumRegex.search('My phone number is (415) 555-4242.') 
    >>> mo.group(1) 
    '(415)' 
    >>> mo.group(2) 
    '555-4242'
    

    2)用管道匹配多个分组

    字符|称为“管道”。希望匹配许多表达式中的一个时,就可以使用它。例如, 正则表达式 r’Batman|Tina Fey’将匹配’Batman’或’Tina Fey’,且返回第一次出现的匹配文本。

    >>> heroRegex = re.compile (r'Batman|Tina Fey') 
    >>> mo1 = heroRegex.search('Batman and Tina Fey.') 
    >>> mo1.group() 
    'Batman' 
     
    >>> mo2 = heroRegex.search('Tina Fey and Batman.') 
    >>> mo2.group() 
    'Tina Fey' 
    

    也可以使用管道来匹配多个模式中的一个,作为正则表达式的一部分。例如,假设你希望匹配’Batman’、‘Batmobile’、'Batcopter’和’Batbat’中任意一个,同样地,返回的文本也是第一次匹配到的文本。

    >>> batRegex = re.compile(r'Bat(man|mobile|copter|bat)') 
    >>> mo = batRegex.search('Batmobile lost a wheel') 
    >>> mo.group() 
    'Batmobile' 
    >>> mo.group(1) 
    'mobile'
    

    3)用问号实现可选匹配

    正则表达式中的(###)?部分表明,模式 ### 是可选的分组。该正则表达式匹配的文本中,### 将出现零次或一次。

    >>> phoneRegex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d\d') 
    >>> mo1 = phoneRegex.search('My number is 415-555-4242') 
    >>> mo1.group() 
    '415-555-4242' 
    >>> mo2 = phoneRegex.search('My number is 555-4242') 
    >>> mo2.group() 
    '555-4242'
    

    4)用星号匹配零次或多次

    >>> batRegex = re.compile(r'Bat(wo)*man') 
    >>> mo1 = batRegex.search('The Adventures of Batman') 
    >>> mo1.group() 
    'Batman' 
     
    >>> mo2 = batRegex.search('The Adventures of Batwoman') 
    >>> mo2.group() 
    'Batwoman' 
     
    >>> mo3 = batRegex.search('The Adventures of Batwowowowoman') 
    >>> mo3.group() 
    'Batwowowowoman'
    

    5)用加号匹配一次或多次

    >>> batRegex = re.compile(r'Bat(wo)+man') 
    >>> mo1 = batRegex.search('The Adventures of Batwoman') 
    >>> mo1.group() 
    'Batwoman' 
     
    >>> mo2 = batRegex.search('The Adventures of Batwowowowoman') 
    >>> mo2.group() 
    'Batwowowowoman' 
     
    >>> mo3 = batRegex.search('The Adventures of Batman') 
    >>> mo3 == None 
    True
    

    6)用花括号匹配特定次数

    • 如果想要一个分组重复特定次数,就在正则表达式中该分组的后面,跟上花括
      号包围的数字。例如,正则表达式(Ha){3}将匹配字符串’HaHaHa’,但不会匹配’HaHa’, 因为后者只重复了(Ha)分组两次。
    • 除了一个数字,还可以指定一个范围,即在花括号中写下一个最小值、一个逗号和一个最大值。例如,正则表达式(Ha){3,5}将匹配’HaHaHa’、‘HaHaHaHa’和’HaHaHaHaHa’。
    • 也可以不写花括号中的第一个或第二个数字,不限定最小值或最大值。例如,(Ha){3,}将匹配 3 次或更多次实例,(Ha){,5}将匹配 0 到 5 次实例。
    6-1)贪心匹配与非贪心匹配

    在字符串’HaHaHaHaHa’中,因为(Ha){3,5}可以匹配3个、4个或 5 个实例,你可能会想,为什么在前面花括号的例子中,Match 对象的 group()调用会返回’HaHaHaHaHa’, 而不是更短的可能结果。毕竟,'HaHaHa’和’HaHaHaHa’也能够有效地匹配正则表达 式(Ha){3,5}。 Python 的正则表达式默认是“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。花括号的**“非贪心”版本匹配尽可能最短的字符串**,即在结束的花括号后跟着一个问号

    >>> greedyHaRegex = re.compile(r'(Ha){3,5}') 
    >>> mo1 = greedyHaRegex.search('HaHaHaHaHa') 
    >>> mo1.group() 
    'HaHaHaHaHa' 
     
    >>> nongreedyHaRegex = re.compile(r'(Ha){3,5}?') 
    >>> mo2 = nongreedyHaRegex.search('HaHaHaHaHa') 
    >>> mo2.group() 
    'HaHaHa' 
    

    7)findall()方法

    书上内容
    注意,若像r’((##)($$)(%%%))'小分组外面还有一个大分组,则findall()返回的列表中的子元组的第一个元素是大分组的内容,即匹配的是整个正则表达式。

    phoneNumRegex = re.compile(r'((\d\d\d)-(\d\d\d)-(\d\d\d\d))')
    matches = phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
    print(matches)
    
    [('415-555-9999', '415', '555', '9999'), ('212-555-0000', '212', '555', '0000')]
    

    作为 findall()方法的返回结果的总结,请记住下面两点:

    • 1.如果调用在一个没有分组的正则表达式上,例如\d\d\d-\d\d\d-\d\d\d\d,方法findall()将返回一个匹配字符串的列表,例如[‘415-555-9999’, ‘212-555-0000’]。

    • 2.如果调用在一个有分组的正则表达式上,例如(\d\d\d)-(\d\d\d)-(\d\d\d\d),方法findall()将返回一个字符串的元组的列表(每个分组对应一个字符串),例如[(‘415’, ‘555’, ‘1122’),(‘212’, ‘555’, ‘0000’)]。

    8)不区分大小写的匹配

    有时候你只关心匹配字母,不关心它们是大写或小写。要让正则表达式 不区分大小写,可以向 re.compile()传入 re.IGNORECASE 或 re.I,作为第二个参数。

    9)用 sub()方法替换字符串

    Regex 对象的 sub()方法需要传入两个参数。第一个参数是一个字符串,用于取代发现的匹配。第二个参数是一个字符串,即正则表达式。sub()方法返回替换完成后的字符串。

    
    >>> namesRegex = re.compile(r'Agent \w+') 
    >>> namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.') 
    'CENSORED gave the secret documents to CENSORED.' 
    

    \d —— 0 到 9 的任何数字
    \D —— 除 0 到 9 的数字以外的任何字符
    \w —— 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
    \W —— 除字母、数字和下划线以外的任何字符
    \s —— 空格、制表符或换行符(可以认为是匹配“空白”字符)
    \S —— 除空格、制表符和换行符以外的任何字符

    以上内容总结自《Python编程快速上手—让繁琐工作自动化》

    展开全文
  • 使用正则表达式的过滤器 一些最强大的基于UNIX的命令行工具使用正则表达式,包括grep , sed和awk (以及某些编程语言,包括Perl)。 学习如何使用正则表达式是从UNIX命令行的基本用户转变为真正的超级用户的必需...

    在你开始前

    了解对本教程的期望以及如何最大程度地利用本教程。

    关于本系列

    这个由四部分组成的教程系列从头开始涵盖UNIX®。 最初的教程对于那些远离UNIX操作系统已有一段时间的用户来说是一个很好的补充。 对于来自Windows®背景的全新UNIX用户,它也很有用,因为它使用对Windows的引用和比较。 第二个教程着重于vi文本编辑器,它是最强大(也是最神秘的)UNIX实用程序之一。 本教程教您有关使用正则表达式(包括grepsedawk的UNIX命令行过滤器的信息。

    关于本教程

    要释放UNIX命令行过滤器(如grepsedawk背后的功能,需要对正则表达式有深入的了解。 本教程向新用户教授这些实用工具的功能以及如何使用正则表达式来操纵文本。 您将通过使用带有grep简单,有趣的示例开始,然后进入sedawk真实示例。

    目标

    本教程的目的是使UNIX和Linux®用户熟悉三个功能强大的命令行工具,这些工具可用于快速有效地搜索和更改数据。 本教程的开头介绍了许多UNIX实用程序(和编程语言)的基本框架中使用的正则表达式。 以下各节提供了将正则表达式与grepsedawk一起使用的示例。

    先决条件

    您需要对本教程的命令行有基本的了解。 对于本教程的某些部分,了解如何在UNIX中使用stdinstdoutpipe处理输入和输出也很有帮助。

    系统要求

    要完成本教程,只需要在运行任何类似UNIX的操作系统的任何计算机上访问用户帐户即可。 类似UNIX的操作系统包括IBMAIX®操作系统,Linux,Berkeley软件发行版(BSD),MacOS®X(使用终端机访问命令行)以及许多其他操作系统。

    常用表达

    正则表达式是一个字符串,旨在搜索或替换另一个字符串。 乍一看,这似乎是一个非常基本的功能。 大多数用户几乎对每个图形文本编辑器或文字处理应用程序都熟悉简单的搜索和替换功能。 如果将此基本搜索和替换功能与计算器进行比较,则可以将正则表达式与成熟的计算机进行比较。 使用正则表达式作为搜索条件的功能不应被低估。

    使用正则表达式的过滤器

    一些最强大的基于UNIX的命令行工具使用正则表达式,包括grepsedawk (以及某些编程语言,包括Perl)。 学习如何使用正则表达式是从UNIX命令行的基本用户转变为真正的超级用户的必需步骤。 正则表达式语法有几种不同的版本, grepsedawk多种版本,因此本教程重点介绍在每种实现中相当标准的最常见构造。 不要忘记参考系统的man页以获取语法和命令行选项的详细信息。

    基础

    在探索使用正则表达式的UNIX应用程序之前,重要的是要学习基础知识。 在本节中,请继续阅读。 稍后,您将在grep尝试一些示例。

    基本搜索

    正则表达式使用正常字符的字符串以及指示搜索条件的特殊字符组合。 在最基本的情况下,根本不使用特殊字符。 例如,如果您只想使用术语“ golf作为搜索条件,则键入以下内容:

    golf

    这是一个正则表达式! 它搜索单词golf所有实例。 正则表达式区分大小写,因此此搜索将找到g olf所有实例,但不会找到G olf实例。

    使用括号

    要同时搜索g olfG olf ,可以使用方括号(正则表达式中的特殊字符)并列出要搜索的单个字符的字符串。 这类似于搜索内的搜索(这是正则表达式背后的魔力)。

    [Gg]olf

    相同的概念适用于任何字符列表-不仅用于区分大小写。 例如,您可能要搜索golfgelf ,这是一项新的运动,它由您组成:

    g[oe]lf

    时期

    现在,假设您还有第三项运动gilf ,您也想检查一下。 一种使用到目前为止所学知识的方法是在搜索条件中使用oei 。 但是随着搜索量的增长,您可能希望找到所有以g开头和以lf结尾且中间有一个字符的字符。 为此,请使用另一个特殊字符,即句点(。)。

    g.lf

    这将查找所有以g开头并以lf结尾且之间有一个字符的字符串。 要将搜索扩展到所有以g开头和以f结尾且中间有两个字符的字符串,可以使用两个句点:

    g..f

    用grep搜索文件

    现在,您已经对正则表达式背后的概念有了基本的了解,是时候开始使用实际示例了,以便您可以实际使用它们了。 您将尝试使用的第一个命令行应用程序是grepgrep实际上是从正则表达式g/RE/p获得其名称的。 grep用于在一个或多个文件中搜索特定字符串的实例。 默认情况下, grep输出您的搜索字符串出现的每一行(与搜索字符串本身相反)。 如果要搜索多个文件,则grep还会输出找到该行的文件名。

    使用以下文本创建一个名为grep.txt的文件:

    I like golf. Golf is played on grass. I created gilf.

    grep的基本语法为:

    grep REGULAREXPRESSION FILENAME(S)

    基本搜索

    现在,回到正则表达式的第一个示例: golf一词本身。 要将此表达式与grep ,请输入:

    grep golf grep.txt

    此命令将搜索字符串的所有实例的grep.txt文件golf ,并输出包含该字符串的行。 您的输出应为:

    I like golf.

    使用括号

    接下来,尝试使用上面讨论的一些特殊字符。 您可以使用方括号(方括号表达式)表示您要搜索golfGolf

    grep [gG]olf grep.txt

    输出看起来像这样:

    I like golf. Golf is played on grass.

    时期

    要搜索golfgilf ,可以再次使用括号。 相反,尝试使用句点来表示您要搜索glf之间的任何字符:

    $grep g.lf grep.txt

    输出看起来像这样:

    I like golf. I created gilf.

    搜索高尔夫,高尔夫和吉尔夫

    现在,您已经找到了获取每种golf变化的方法,但是您的搜索都没有返回全部三个实例: golfGolfgilf 。 花点时间考虑一下如何搜索这三个。 有多种方法可以做到这一点。 这是几个例子:

    grep ..lf grep.txt grep [gG][oi]lf grep.txt

    两种方法都返回所有三行:

    I like golf. Golf is played on grass. I created gilf.

    短跑

    您能想到其他方法吗? 到目前为止,您仅学习了在正则表达式中使用的两个特殊字符。 这仅仅是开始! 一些特殊字符在其他特殊字符内使用。 例如,当您将一组字符括在方括号中时,可以使用破折号(-)搜索一系列字符。 将以下行添加到您的文本文件:

    What is g2lf?

    到目前为止,您已经了解到,如果您使用g.lfg[oi2]lf类的正则表达式,将在搜索结果中包含此行。 使用句点可返回结果,其中该位置有任何字符; 使用[oi2]返回的结果仅是o i2在该位置。 您可以使用破折号来实现第三个方法,该方法包括多个字符,但不是每个字符:

    grep g[a-z]lf

    此方法产生以下输出:

    I like golf. I created gilf.

    从输出中可以看到,此方法搜索介于az之间a任何字符(按字母顺序)。 这不包括数字或符号介于glf之间的字符串,这些字符串或符号不是真正的单词,并且可能不属于所需搜索条件。

    括号内的破折号

    您还可以通过在括号内包括其他字符集来搜索多个字符序列。 例如,要搜索azAZ ,请使用以下搜索:

    grep g[a-zA-Z]lf

    插入符号

    随着字符序列列表的增加,您可能会发现避免某些字符而不是指定要查找的字符会更容易搜索。 您可以通过在搜索序列之前(在方括号内)使用尖号(^)来完成此操作。 那是一个相当大的数目,但是通过遵循一个示例应该很容易理解。 更改搜索以避免使用数字,但使用此grep命令可以包括所有其他字符:

    grep g[^0-9]lf

    此搜索类似于先前的搜索,该搜索找到了所有字母字符,但是该搜索还返回了不在字母中且不在数字序列中的字符,例如数字符号( # )和美元符号( $ )。您排除了。

    星号

    下一个要试验的特殊字符是星号(*),它是几个重复运算符之一。 大多数人都熟悉使用命令行上的星号作为文件名(通配符)的搜索条件,但是在正则表达式中使用星号却大不相同。 星号表示搜索项(前一个字符或方括号表达式)可以出现零次,一次或多次。 要尝试此操作,请将以下几行添加到您一直在使用的grep.txt文件中:

    This time the o is missing in glf. Some people might say goolf. But they would not say goilf.

    现在,整个文件应如下所示:

    I like golf. Golf is played on grass. I created gilf. What is g2lf? This time the o is missing in glf. Some people might say goolf. But they would not say goilf.

    尝试在golfo后使用星号:

    grep go*lf grep.txt

    您的搜索返回包含单词golfglfgoolf

    I like golf. This time the o is missing in glf. Some people might say goolf.

    问号

    另一个重复运算符是问号(?)。 问号的功能类似于星号,除了搜索项可以出现零或一次。 多次出现将不匹配。 尝试使用问号而不是星号来执行刚刚执行的搜索:

    grep go?lf grep.txt

    如您所见,这次将golfglf作为匹配结果返回,但是goolf并不是因为在问号之前有多个搜索项o实例:

    I like golf. This time the o is missing in glf.

    加号

    通用重复运算符的最后一个是加号(+)。 当搜索项出现一次或多次时,将找到一个加号。 与星号不同,必须找到至少一个匹配项。 请尝试以下示例:

    grep go+lf grep.txt

    这次,搜索返回golfgoolf ,但没有返回glf因为未找到o

    I like golf. Some people might say goolf.

    行首和行尾锚

    在继续使用sed之前要了解的最后一个特殊字符是:行首锚(使用插入符号实现)和行尾锚(使用美元符号实现)。 您可能还记得在本教程前面使用插入号来否定方括号表达式。 在支架之外使用插入号时,它会执行完全不同的功能。 将插入号放在正则表达式的开头可指示搜索仅在行的开头进行。 换句话说,正则表达式中的第一个字符(在插入号之后)必须与新行中的第一个字符匹配,搜索才能匹配该行。 同样,在正则表达式的末尾放置一个美元符号,以表示您只想返回与行尾匹配的结果。 换句话说,您的正则表达式中的最后一个字符(在美元符号之前)必须与行中的最后一个字符匹配,搜索才能与该行匹配。 要对此进行测试,请将以下两行添加到grep.txt中:

    golf has been a fine example let's talk about something besides golf

    请注意,你不应该大写或圈点golf此测试,因为这将表明一个相同的单词在一行或使用锚线的开始结束操作不同的搜索。 要测试行首锚,请键入以下内容:

    grep ^golf grep.txt

    输出看起来像这样:

    golf has been a fine example

    要测试行尾锚,请使用相同的搜索,但要删除插入符号并在golf之后添加一个美元符号。

    grep golf$ grep.txt

    使用行尾锚点的输出如下所示:

    let's talk about something besides golf

    回顾

    现在,您已经通过在命令行上使用grep学习了正则表达式的基础。 接下来,您将学习使用sed ,它不仅搜索文本,还将替换它。 首先,这是到目前为止所学知识的回顾:

    . A period represents any single character [] Brackets enclose character sequences - A dash is used between characters to create a sequence (inside []) ^ A carrot is used to negate a sequence (inside []) * An asterisk searches for zero, one, or many instances of a search item ? A question mark searches for zero or one instance of a search item + A plus sign searches for one or many instances of a search item $ A dollar sign searches the end of a line ^ A carrot searches the beginning of a line \ A backslash preceding a special character makes it a plain character (See the next section.)

    使用sed编辑文件

    sed是流编辑器的缩写。 文本编辑器的传统的现代定义是一个交互式应用程序,可用于创建和编辑文本文件。 sed还是文本编辑器,但它是命令行实用程序,而不是交互式实用程序,这使其成为批处理编辑的极其强大的工具。 sed通常在UNIX shell脚本中用于过滤大量文本文件。 在本教程的第一部分中,您使用了一个讨论高尔夫的小测试文件。 为了演示sed编辑器的高级功能,您将使用一小段开发人员可能希望在批处理过程中更改的代码段。

    复制此文本并将其粘贴到名为sed.txt的文件中:

    system "echo 'project:$project' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile"; system "echo 'threads:$threads' >> logfile";

    正斜杠

    前面解释过的所有与grep一起使用的特殊字符也可以在sed 。 要使用sed ,您必须学习一些其他语法。 sed的基本表达式由四部分组成,并用正斜杠(/)分隔。 这是基本sed命令的常见语法:

    sed s/REGULAREXPRESSION/REPLACEMENTSTRING/flags INPUT_FILE

    s-搜索和替换

    s表示您要执行搜索并替换 。 正斜杠用于绑定sed正则表达式。 例如,如果您只想将logfile替换为logfile.txt ,则可以运行以下命令:

    sed s/logfile/logfile.txt/ sed.txt

    输出看起来像这样:

    system "echo 'project:$project' >> logfile.txt"; system "echo 'version:$version' >> logfile.txt"; system "echo 'optionalid:$optionalid' >> logfile.txt"; system "echo 'nodes:$nodes' >> logfile.txt"; system "echo 'threads:$threads' >> logfile.txt";

    在这种情况下要注意的重要一点是sed实际上不会更改sed.txt的内容。 而是将输出发送到标准输出。 对于这些示例,您将输出发送到标准输出,以便您可以立即查看操作结果。

    为了将来参考,可以捕获输出或将其发送到新文件中。 例如,要将输出发送到sed_new.txt,请运行以下命令:

    sed s/logfile/logfile.txt/ sed.txt > sed_new.txt

    反斜杠

    在学习斜杠时,还有另一个非常重要的特殊字符要学习。 反斜杠(\)称为转义字符,因为它从正则表达式解释中转义下一个字符。 更简单地讲,在特殊字符前加反斜杠可使该字符成为普通项目而不是命令项目。 这很重要,因为许多文件(尤其是在编写代码时)大量使用了用于执行正则表达式的相同字符。 在sed.txt文件中,您会注意到使用了美元符号。 如果要替换$project而不是project ,则需要在搜索中使用转义符并替换:

    sed s/\$project/\$project_name/ sed.txt

    您可以在输出中看到$project已更改,但project并未更改。

    system "echo 'project:$project_name' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile"; system "echo 'threads:$threads' >> logfile";

    更改一个项目的多个实例

    这带来了sed另一个重要功能。 如果要更改project两个实例怎么办? 从到目前为止所学的知识来看,合理的答案是仅将project用作正则表达式,但这并不完全正确。 继续尝试一下,以便我可以说明和解释该过程:

    sed s/project/project_name/ sed.txt

    您可以在输出中看到project的第一个实例已更改为project_name

    system "echo 'project_name:$project' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile"; system "echo 'threads:$threads' >> logfile";

    但是,第二个实例不是,即使它确实与您的正则表达式匹配。 从第一个示例知道, sed似乎更改了输入中的每个匹配字符串,而不仅仅是第一个匹配项,因为sed更改了logfile每个实例。

    区别在于, logfile每个实例都位于单独的行中,而同一行中有两个project实例。 为什么这会有所作为? sed被实现为行编辑器。 每个单独的行一次放入一个内存,然后作为一个单元进行操作。 在运行sed ,请记住这一点,因为所有命令行选项均受此设计原则限制(这使sed大多数实现都没有与系统内存有关的文件大小限制)。 默认情况下,每行被视为sed命令的新执行。 即使在第一个示例中没有出现这种方式,每个sed命令也仅替换匹配字符串的第一个实例。 但是,您可以简单地使用g标志进行更改。

    g标志

    执行相同的sed命令,但是这次最后加上g

    sed s/project/project_name/g sed.txt

    这次, project两个实例在第一行都更改为project_name

    system "echo 'project_name:$project_name' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile"; system "echo 'threads:$threads' >> logfile";

    您可能还记得g是global的缩写。

    运行初步搜索

    sed另一个强大功能是在搜索和替换操作之前运行初步搜索,以查看您是否在要执行命令的行上。 这几乎就像在sed内部执行grep 。 在您的示例中,您可能想要更改node变量的日志文件,而不是将其与所有其他输出分组。 为此,您想将字符串logfile更改为logfile_nodes ,但仅在与节点有关的行上。 这个命令就是这样做的:

    sed /nodes/s/logfile/logfile_nodes/ sed.txt

    这是输出:

    system "echo 'project:$project' >> logfile"; system "echo 'version:$version' >> logfile"; system "echo 'optionalid:$optionalid' >> logfile"; system "echo 'nodes:$nodes' >> logfile_nodes"; system "echo 'threads:$threads' >> logfile";

    更改每个以冒号结尾的字符串

    现在,尝试在使用grep同时使用sed命令中学习到的一些关于正则表达式的知识。 您可以使用sed内部的以下正则表达式来更改每个以冒号结尾的字符串:

    sed s/[a-z]*:/value:/g sed.txt

    输出看起来像这样:

    system "echo 'value:$project' >> logfile"; system "echo 'value:$version' >> logfile"; system "echo 'value:$optionalid' >> logfile"; system "echo 'value:$nodes' >> logfile"; system "echo 'value:$threads' >> logfile";

    这很酷,但不是很合逻辑。 它不是很合逻辑的原因是因为您在所有变量之前都具有单词value ,而无法知道哪个变量是哪个。 但是,您可以使用sed另一个功能将其变成一个真实的示例。

    &符

    “与”号(&)表示正则表达式匹配的字符串。 换句话说,如果[az]*:证明是project:在特定的行上,“&”号将保留该值。 这可能非常有用。 看一下这个例子:

    sed s/[a-z]*:/new_\&/g sed.txt

    这次,您更改了每个匹配的字符串,但是保留了与每个变量关联的标识符:

    system "echo 'new_project:$project' >> logfile"; system "echo 'new_version:$version' >> logfile"; system "echo 'new_optionalid:$optionalid' >> logfile"; system "echo 'new_nodes:$nodes' >> logfile"; system "echo 'new_threads:$threads' >> logfile";

    执行多个命令序列

    您还可以使用sed一次执行多项操作。 要一次执行多个命令序列,必须在每个表达式之前使用-e标志。 缺省情况下, sed将第一个参数解释为一个表达式,但是在运行多个命令时需要更加明确,因此需要-e标志。 例如:

    sed -e s/[a-z]*:/value:/g -e s/logfile/name/g sed.txt

    您可以看到在这种情况下sed在适当的位置插入了value:name

    system "echo 'value:$project' >> name"; system "echo 'value:$version' >> name"; system "echo 'value:$optionalid' >> name"; system "echo 'value:$nodes' >> name"; system "echo 'value:$threads' >> name";

    正如您开始看到的那样, sed可以是一个非常强大的工具,可以在大规模批处理过程中编辑文件。 在前面的示例中,您正在处理单个文件,就像使用grep 。 不要忘记这些实用程序的部分功能是跨多个文件运行它们,您可以使用通配符或文件列表来代替在本教程中一直使用的单个文件。

    在命令行上使用awk

    本教程首先介绍了正则表达式,然后介绍了grepsedgrep是功能强大的搜索实用程序,而sed是功能更强大的搜索和替换实用程序。 awk下一步,使用成熟的命令行编程语言中的正则表达式。 就像sed一样,当在命令行上使用awk时,它将接受基于行的输入。 awk解释一行输入,但与sed不同,它将行中的每一条输入作为变量处理,这些变量可用作内联代码的输入和输出。

    应当注意,AWK(大写)是一种成熟的编程语言,可用于编写脚本(而不是仅在命令行上使用),但是本教程重点介绍awk ,这是命令行实用程序即时解释AWK命令。

    顺便说一句,如果有人正在阅读本文并试图考虑您所学到的一切的实际用途,那么我只是使用grep在一些旧代码中搜索了很好的awk示例:

    grep awk */*.pl

    大多数系统管理员或程序员每天都会发现这些工具的用途。 这是我的输出的几行:

    Edaemon/m_checkcurrentdisk.pl:$freespace = `awk '(NR==1) {print \$4 / 1024 / 1024}' grep.tmp`; Edaemon/m_getdatetime.pl:$month = `awk '(NR==1) {print \$2}' datetime.txt`; Odaemon/odaemon.beowulf.dvd.pl:$filesize = `awk '(NR==1) {print \$1}' temp.txt`;

    这些都是很好的示例,因为它们显示了awk基本用法。 首次尝试时,请使其更加简单。 对于使用awk进行的测试,请在空目录中创建以下文件(每个文件的内容无关,它们可以为空):

    Screenshot_1.jpg Screenshot_2.jpg Screenshot_3.jpg awk.txt regular.txt sed.txt

    使用ls的输出作为awk的输入

    默认情况下, awk读取输入文件中的每一行,并将内容分成由空格确定的变量。 在一个非常简单的示例中,您可以将ls的输出用作awk输入并打印结果。 本示例使用带有管道字符(|)的ls将输出发送到awk

    ls | awk ' { print $1 } '

    随后, awk在每一行上打印第一项,在这种情况下,这是每一行上的唯一项:

    Screenshot_1.jpg Screenshot_2.jpg Screenshot_3.jpg awk.txt regular.txt sed.txt

    使用ls -l生成awk的多列输入

    那真的很基本。 在下一个示例中,使用ls -lawk生成多列输入:

    ls -l

    ls实现因系统而异,但这是一些示例输出:

    total 432 -rw-rw-rw- 1 guest guest 169074 Oct 15 14:51 Screenshot_1.jpg -rw-rw-rw- 1 guest guest 23956 Oct 15 20:56 Screenshot_2.jpg -rw-rw-rw- 1 guest guest 12066 Oct 15 20:57 Screenshot_3.jpg -rw-r--r-- 1 tuser tuser 227 Oct 15 20:16 awk.txt -rw-r--r-- 1 tuser tuser 233 Oct 15 19:35 regular.txt -rw-r--r-- 1 tuser tuser 227 Oct 15 23:16 sed.txt

    请注意,文件所有者是每一行的第三项,文件名是每一行的第九项(默认情况下,项目用awk的空格分隔)。 您可以使用awk通过在每行上打印第三和第九个变量来从此列表中拉出文件所有者和文件名。 这是如何做:

    ls -l | awk ' { print $3 " " $9 } '

    您会注意到awkprint命令有两个引号和一个空格。 这只是在输出中的文件所有者和文件名之间打印一个空格:

    guest Screenshot_1.jpg guest Screenshot_2.jpg guest Screenshot_3.jpg tuser awk.txt tuser regular.txt tuser sed.txt

    您可以在awk打印语句中的变量之间用引号引起来的文本。

    使用正则表达式指定行

    现在,您已经了解了如何使用awk的基础知识,但是本教程不是关于正则表达式的吗? 在awk ,正则表达式被大量使用。 最常见的示例是在awk命令之前加一个正则表达式,该正则表达式指定要操作的行。 与sedawk中的正则表达式封装在正斜杠中。 例如,如果您只想对tuser拥有的文件进行操作,则可以使用以下命令:

    ls -l | awk ' /tuser/ { print $3 " " $9 } '

    该命令产生以下输出:

    tuser awk.txt tuser regular.txt tuser sed.txt

    更改文件扩展名

    在另一个示例中,您可能想要更改每个文本文件的文件扩展名而不触摸图像文件。 为此,您需要使用句点而不是空格来分隔输入变量,然后使用正则表达式表示您只想搜索文本文件。 要基于句点拆分变量,请使用-F标志,后跟要在引号中使用的字符。 尝试以下示例,将awk输出通过管道传递到外壳程序(它将执行awk生成的命令):

    s | awk -F"." ' /txt/ { print "mv " $1 "." $2 " " $1 ".doc" } ' | bash

    随后的ls -l将显示新文件名:

    -rw-rw-rw- 1 guest guest 169074 Oct 15 14:51 Screenshot_1.jpg -rw-rw-rw- 1 guest guest 23956 Oct 15 20:56 Screenshot_2.jpg -rw-rw-rw- 1 guest guest 12066 Oct 15 20:57 Screenshot_3.jpg -rw-r--r-- 1 tuser tuser 227 Oct 15 20:16 awk.doc -rw-r--r-- 1 tuser tuser 233 Oct 15 19:35 regular.doc -rw-r--r-- 1 tuser tuser 227 Oct 15 23:16 sed.doc

    记住,这些是开始使用awk的基础知识,但是AWK是一种成熟的编程语言,其功能远远超过本教程中介绍的内容。 看一下awk man页。 如果您想学习更多,明智的做法是购买一本好书。

    Wrapping up

    本教程中的示例应该足以使您基本了解使用正则表达式的UNIX过滤器以及如何在命令行上使用它们。 使用的三个实用程序grepsedawk具有许多内置选项和功能,这些功能远远超出了本教程中讨论的开始课程。 有些书专门讨论sedawk 。 在grepman页中搜索以了解有关其功能的更多信息。

    如果您觉得自己已经掌握了正则表达式的基础知识并想迈出下一步,那么Perl是另一种很棒的语言,它可以充分利用正则表达式。 Perl的高手喜欢那些简明而又高效的代码行,对于陌生的用户来说,这似乎是毫无意义的字符串。

    如果您已按照本系列中的每个教程进行了学习,那么现在您已经了解了命令行上的基本文件操作,如何使用vi文本编辑器以及如何使用命令行过滤器。

    请密切注意本系列的下一篇教程,该教程将介绍Shell技巧和窍门。 同时,在本教程中,您将学习有关正则表达式和实用程序的所有知识。 它们使您可以将漫长而复杂的任务变成您引以为傲的快速,优雅的解决方案!


    翻译自: https://www.ibm.com/developerworks/aix/tutorials/au-unixtips3/index.html

    展开全文
  • C/C++之字符替换方法(利用正则表达式) 在编程中,我们有不少需要对字符/字符串进行匹配的场景。如果利用循环体来进行查找匹配,对于数据量比较少的功能还可以实现,但是如果对于数据量比较大的场景,那么其所消耗...
  • 批处理正则更名工具

    2011-10-29 11:39:13
    批处理正则表达式批量更名工具 使用方法: 1、复制RegRen.vbs到c:\windows\system32文件夹中。 2、在要改名文件所在文件夹的CMD窗口中,使用以下方式进行文件正则表达式更名: RegRen (.{4})(o\.exe) h$1$2 ...
  • 故采用正则表达式的形式进行文档处理。 要读取文档内10w多条的数据,可按照3步走战略: 1.外层循环利用文件过滤器读取文件夹内所有符合条件的文件。 2.读取每一个筛选到的文件,利用正则表达式去除超链接符号。 3....
  • 工欲善其事,必先利其器 巧用正则表达式,批量处理字符串
  • Flink的正则表达式--CEP规则引擎

    千次阅读 2021-04-22 17:15:45
    这是彭文华的第100篇原创Flink开始往各大厂渗透了,虽然批处理能力弱了一些,但是流式数据基本已经是标配了。Flink不仅有优秀的Checkpoint机制(流式数据快照)、Waterma...
  • C++使用正则表达式进行替换和遍历 #include<iostream> #include<regex> using namespace std; int main(){ smatch results; string str="HyperWorks contains HyperMesh and HyperView and ...
  • 正则表达式基本符号Whether you’ve been searching with Grep or looking at programs that can batch rename files for you, you’ve probably wondered if there was an easier way to get your job done....
  • dos 批处理中findstr的使用
  • //利用正在exec方法 function fn(str1,str2){ var re = new RegExp("[^"+str1+"]|[^"+str2+"]","g"); var arr = [],tmp=null; while((tmp=re.exec(str1+str2))!... re...
  • grep egrep(文本过滤) fgrep(不支持正则) 格式 grep [选项] 模式 文件 选项:--color 指定颜色  -v反向匹配,显示不能被模式匹配到的行  -o:仅匹配被模式匹配到的字符串,而非整行  -q:静默模式  -i:不...
  • 但是,它后面可以跟一个“count”整数,它将实际执行语句批处理很多次(以前有人实际使用过它吗??)它可以跟在同一行上的一行注释(但不是多行,我测试过了)所以magic regex看起来像:"(?m)^\s*GO\s*\d*\s*$" 但...
  • FINDSTR正则表达式小结

    2019-10-18 12:35:39
    前言:最近写了一个bat用于快速编译swf至目标目录,想利用FINDSTR命令通过匹配目标目录名称,匹配数量大概600多个,发现匹配耗时比较久,大概花费10余秒,因此还是放弃字符...批处理运行效率讨论帖汇总 FINDSTR正...
  • 水淼正则表达式精灵是一款适合初学者学习、程序员调试、任务批处理正则表达式工具。拥有友好的界面,内置语法参考和学习教程,非常容易操作,执行效率高。正则在文本处理应用领域非常广,很多功能都少不了正则,很...
  • EmEditor 中的正则表达式,查找与替换操作方法查找替换在文件中查找在文件中替换 正则表达式通常被用于“查找”,“替换”,“在文件中查找”,“在文件中替换”这些指令中。选择这些指令后,您可以在弹出的对话框...
  • re.sub(‘正则表达式’,‘替换成什么字符串’,‘字符串’ ) 找到指定字符串并替换     文件读取 读文件 ‘r’代表读取文件 encoding= ‘utf8’ 使用utf8 编码 路径前最好加上r...
  • 因开发需要将多个代码文件的具有相同特征的字符进行统一替换,所以就在网上找了多个类似的文本批量替换工具,但都不能够实现无限制的并具有完全正则表达式规则匹配的工具,故此,自己写了一个,拿出来跟大家分享,...
  • #include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;regex&gt; ...(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,498
精华内容 4,199
关键字:

批处理 正则表达式

友情链接: CommTest.rar