linux中的正则

普通正则

  1. ^word 搜索以word 开头的
    [root@oldboylinux ~/test]#alias grep='grep --color'
    [root@oldboylinux ~/test]#grep  qq oldboy.txt 
    My qq is 4920085
    [root@oldboylinux ~/test]#cat oldboy.txt 
    I am a linux sa.
    My blog is www.blog.com
    My qq is 4920085
    [root@oldboylinux ~/test]#grep ^[Mm] oldboy.txt 
    My blog is www.blog.com
    My qq is 4920085
    my name is seven
    [root@oldboylinux ~/test]#grep ^M oldboy.txt 
    My blog is www.blog.com
    My qq is 4920085
    [root@oldboylinux ~/test]#
    

     

  2. word$ 搜索以word结尾的
    [root@oldboylinux ~/test]#grep com$ oldboy.txt 
    My blog is www.blog.com
    [root@oldboylinux ~/test]#

     

  3. . 代表且只能代表任意的一个字符
    [root@oldboylinux ~/test]#grep . oldboy.txt 
    I am a linux sa.
    My blog is www.blog.com
    My qq is 4920085
    my name is seven

     

  4. \ 例如\.转义符号,让有着特殊身份意义的符号,脱掉马甲,还原原型
    [root@oldboylinux ~/test]#grep \" oldboy.txt 
    my phone is "123456"

     

  5. * 例如 o* 重复0个或多个字符
    [root@oldboylinux ~/test]#grep 0* oldboy.txt 
    I am a linux sa.
    My blog is www.blog.com
    My qq is 4920085
    My qq is 492000000000085
    My qq is 492085
    my name is seven
    my phone is "123456"
    [root@oldboylinux ~/test]#grep ^My* oldboy.txt 
    My blog is www.blog.com
    My qq is 4920085
    My qq is 492000000000085
    My qq is 492085

     

  6. .*匹配所有的字符 ^.*以任意多个字符开头的
  7. [] 字符集合的重复特殊字符的符号
  8. [^word]匹配不包含^后面的任意字符内容
    [root@oldboylinux ~/test]#grep [a-z] oldboy.txt 
    I am a linux sa.
    My blog is www.blog.com
    My qq is 4920085
    My qq is 492000000000085
    My qq is 492085
    my name is seven
    my phone is "123456"

     

  9. a\{n,m\}重复n到m次,前一个重复字符
  • a\{n,\}重复n次以上,前一个重复字符
  • a\{n,\重复n次,前一个重复字符
    [root@oldboylinux ~/test]#grep 0\{2} oldboy.txt 
    [root@oldboylinux ~/test]#grep 0\{2\} oldboy.txt 
    [root@oldboylinux ~/test]#egrep 0{2} oldboy.txt 
    My qq is 4920085
    [root@oldboylinux ~/test]#alias egrep='egrep --color'
    [root@oldboylinux ~/test]#egrep 0{2} oldboy.txt 
    My qq is 4920085
    [root@oldboylinux ~/test]#egrep 0\{,10\} oldboy.txt 
    I am a linux sa.
    My blog is www.blog.com
    My qq is 4920085
    My qq is 492000000000085
    My qq is 492085
    my name is seven
    my phone is "123456"
    [root@oldboylinux ~/test]#egrep 0\{5,10\} oldboy.txt 
    My qq is 492000000000085
    [root@oldboylinux ~/test]#
    [root@oldboylinux ~/test]#egrep 0\{2\} oldboy.txt (不能精确的过滤2个0)
    My qq is 4920085
    My qq is 492000000000085

     

扩展正则

[root@oldboylinux ~/test]#grep -E "\<My\>.+\<qq\>" oldboy.txt 
My qq is 4920085
My qq is 492000000000085
My qq is 492085

3. 用于egrep和 grep -E的元字符扩展集

+       :匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。

?       :匹配零个或多个先前的字符。如:'gr?p'匹配gr后跟一个或没有字符,然后是p的行。

a|b|c    :匹配a或b或c。如:grep|sed匹配grep或sed

()       :分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。

x{m},x{m,},x{m,n} :作用同x\{m\},x\{m,\},x\{m,n\}

5. Grep命令选项

   -a或--text   不要忽略二进制的数据。

   -A   <显示列数>或--after-context=<显示列数>    除了显示符合范本样式的那一列之外,并显示该列之后的内容。

   -b或--byte-offset    在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。

   -B<显示列数>或--before-context=<显示列数>    除了显示符合范本样式的那一列之外,并显示该列之前的内容。

   -c或--count   计算符合范本样式的列数。

   -C<显示列数>或--context=<显示列数>或-<显示列数>    除了显示符合范本样式的那一列之外,并显示该列之前后的内容。

   -d<进行动作>或--directories=<进行动作>    当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。

   -e<范本样式>或--regexp=<范本样式>    指定字符串做为查找文件内容的范本样式。

   -E或--extended-regexp    将范本样式为延伸的普通表示法来使用。

   -f<范本文件>或--file=<范本文件>    指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。

   -F或--fixed-regexp    将范本样式视为固定字符串的列表。

   -G或--basic-regexp    将范本样式视为普通的表示法来使用。

   -h或--no-filename    在显示符合范本样式的那一列之前,不标示该列所属的文件名称。

   -H或--with-filename    在显示符合范本样式的那一列之前,表示该列所属的文件名称。

   -i或--ignore-case    忽略字符大小写的差别。

   -l或--file-with-matches    列出文件内容符合指定的范本样式的文件名称。

   -L或--files-without-match    列出文件内容不符合指定的范本样式的文件名称。

   -n或--line-number    在显示符合范本样式的那一列之前,标示出该列的列数编号。

   -q或--quiet或--silent    不显示任何信息。

   -r或--recursive   此参数的效果和指定“-d recurse”参数相同。

   -s或--no-messages    不显示错误信息。

   -v或--revert-match    反转查找。

   -V或--version   显示版本信息。

   -w或--word-regexp    只显示全字符合的列。

   -x或--line-regexp    只显示全列符合的列。

   -y    此参数的效果和指定“-i”参数相同。

   --help    在线帮助。

[root@oldboylinux ~/test]#egrep "32768|32767" /etc/services 
filenet-powsrm  32767/tcp               # FileNet BPM WS-ReliableMessaging Client
filenet-powsrm  32767/udp               # FileNet BPM WS-ReliableMessaging Client
filenet-tms     32768/tcp               # Filenet TMS
filenet-tms     32768/udp               # Filenet TMS
[root@oldboylinux ~/test]#

参考资料

https://blog.youkuaiyun.com/youmatterhsp/article/details/80528761

<think>好的,我现在需要帮用户解答关于Linux正则表达式中&符号的用法。首先,我得回忆一下用户之前的问题和我的回答,确保一致性。用户之前询问的是Linux sort命令的默认排序方式,现在转向正则表达式中的&符号,这可能是因为他在处理文本排序或过滤时遇到了相关问题。 接下来,我需要查阅用户提供的引用内容。引用[3]提到了&&符号,表示前面的命令执行成功后再执行后面的命令,但这可能和正则表达式中的&不同。引用[4]提到了元字符,但未直接提到&。其他引用主要涉及正则表达式的基础元素,如^、$、*、[]等,但也没有关于&的信息。这说明用户提供的资料中关于&的内容有限,可能需要我结合更广泛的知识来回答。 根据我的知识,正则表达式中的&通常有两种情况:在基本正则表达式中,&可能没有特殊含义,但在某些工具或扩展正则表达式中,可能有特定用途。例如,在sed替换命令中,&代表匹配到的整个内容。此外,在替换操作中,&用来引用整个匹配的模式。用户可能是在使用sed或类似工具时遇到了&的问题。 需要确认用户的具体使用场景。例如,是否在替换操作中使用&,或者在模式匹配中。用户的问题比较笼统,所以最好全面覆盖不同情况下的用法,并举例说明,这样用户可以根据自己的情况选择适合的信息。 另外,用户可能混淆了Shell中的&&和正则表达式中的&。需要明确区分,避免误导。在正则表达式中,单独的&通常不是元字符,但在替换操作中有特殊意义,比如在sed中。而在某些编程语言的正则表达式中,如Perl兼容正则表达式(PCRE),&可能有不同的用途,但Linux中常用的工具如grep、sed、awk可能有不同的实现。 需要检查常用工具中的具体用法,比如sed的替换命令中的&,以及是否有其他上下文中的特殊含义。例如,在sed中,s/pattern/replacement/,这里的replacement部分可以使用&来代表匹配到的整个模式。例如,s/a/&b/g会将每个a替换成ab。 此外,在vim的替换命令中,&同样代表匹配的整个内容。这可能也是用户遇到的场景之一。需要举例说明这些情况,让用户明白不同工具中的差异。 还要注意转义字符的问题,比如在某些情况下是否需要转义&符号。例如,在sed中,如果要在替换文本中使用字面的&,需要用反斜杠转义,即\&。 可能还需要提到,在基本正则表达式(BRE)和扩展正则表达式(ERE)中,&的行为是否不同。根据POSIX标准,&在BRE中通常没有特殊含义,除了在替换操作中的特定上下文。而ERE中可能也是如此,但需要确认。 总结下来,回答的结构应该是先解释&在不同上下文中的用法,区分正则表达式模式匹配和替换操作中的不同,然后给出具体例子,如sed和vim中的使用,最后注意事项,比如转义和工具差异。这样用户能够全面了解&的用法,避免混淆。同时,需要对比Shell中的&&,明确两者的不同,防止用户误解。</think>### Linux正则表达式中`&`符号的用法详解 在Linux正则表达式中,`&`符号的用法需要根据**上下文**区分,主要涉及**模式匹配**和**替换操作**两种场景。以下是具体解析: --- #### 一、在**替换操作**中的特殊含义(核心用法) `&`符号在替换操作中(如`sed`或`vim`的替换命令)表示**引用匹配到的完整内容**,类似占位符功能[^4]。 **示例场景**:将匹配到的单词用括号包裹 ```bash # 使用sed替换文本 echo "hello world" | sed 's/world/[&]/g' ``` **输出**: ``` hello [world] ``` *解释*: - `world`是正则匹配到的内容,`&`代表整个匹配结果。 - 替换为`[&]`相当于`[world]`。 --- #### 二、在**模式匹配**中的行为 在正则表达式模式匹配(如`grep`或`awk`)中,**`&`本身没有特殊含义**,仅作为普通字符匹配字面的`&`符号[^1][^4]。 **示例**: ```bash # 查找包含"linux&python"的行 grep 'linux&python' file.txt ``` *说明*: - 正则表达式直接匹配文本中的`linux&python`字符串,`&`不会被解析为元字符。 --- #### 三、特殊工具中的扩展用法 1. **`sed`命令的标签引用** 在`sed`中使用`\(...\)`捕获分组后,可通过`\1`、`\2`等引用分组,但`&`始终表示**整个匹配内容**: ```bash echo "123abc" | sed 's/[0-9]\+/数字:&/' ``` **输出**: ``` 数字:123abc ``` *注意*:`[0-9]\+`匹配连续数字,`&`引用匹配到的`123`。 2. **`vim`编辑器替换操作** `vim`的替换模式同样支持`&`引用匹配内容: ```vim :%s/error/&_log/g # 将所有"error"替换为"error_log" ``` --- #### 四、注意事项 1. **转义需求** 若需在替换操作中表示字面的`&`符号,需用反斜杠转义: ```bash echo "test" | sed 's/test/\&/g' # 输出"&" ``` 2. **与Shell运算符`&&`的区别** Shell中的`&&`表示逻辑“与”(前一条命令成功则执行后一条),与正则表达式中的`&`无关[^3]。 --- #### 五、对比表格 | 场景 | `&`符号作用 | 示例 | |---------------------|-------------------------------------|-------------------------------| | 替换操作(sed/vim) | 引用匹配到的完整内容 | `sed 's/abc/[&]/'` → `[abc]` | | 模式匹配(grep) | 匹配字面的`&`字符 | `grep 'C&R' file` | | Shell命令 | 逻辑运算符(与正则无关) | `cmd1 && cmd2` | --- ### 相关问题 1. 如何在`sed`替换操作中同时使用分组引用和`&`符号? 2. 正则表达式中哪些符号需要转义? 3. 如何用`awk`实现类似`sed`的`&`替换功能?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值