sed笔记231127 `-e`基本正则,`-E`扩展版正则

-e基本正则,-E扩展版正则

  • -E, -r, --regexp-extended
    在脚本中使用扩展正则表达式(为保证可移植性使用 POSIX -E)。
  • -e--expression 接基本正则表达式, 可多次使用,多次过滤
  • -f--file 选项接脚本文件, 注意是脚本文件, 而不是输入文件

-e可以不写, 如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为
sed脚本。

其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准
输入读取数据。

和grep一样找出文本文件中的匹配行

默认都是普通版正则

# p要与-n连用, 不知为社么
sed -n /pattern/p x.txt
# ↑功能等效↓
sed -ne /pattern/p x.txt
# ↑功能等效↓
grep pattern x.txt
# ↑功能等效↓
cat x.txt | sed -n /pattern/p
# ↑功能等效↓
cat x.txt | sed -ne /pattern/p
# ↑功能等效↓
cat x.txt | grep pattern

扩展版正则

# p要与-n连用, 不知为社么
sed -nE /pattern/p x.txt
# ↑功能等效↓
grep -E pattern x.txt
# ↑功能等效↓
cat x.txt | sed -nE /pattern/p
# ↑功能等效↓
cat x.txt | grep -E pattern
sed查找替换
# 源文件不会被替换, 只输出的内容被替换
# g是整个文档, i是忽略大小写
sed "s/基本正则/替换内容/gi" x.txt
或
sed -e "s/基本正则/替换内容/gi" x.txt
或
sed -E "s/扩展正则/替换内容/gi" x.txt

基本正则和扩展正则

  • sed     默认或-e, --expression sh使用基本版正则

  • grep   默认或-e,        --regexp 启用扩展版正则


  • sed     用-E, -r, --regexp-extended 启用扩展版正则

  • grep   用-E,        --extended-regexp 启用扩展版正则

在基本正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。

在扩展正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。

在基本正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。

在扩展正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。

在扩展正则表达式中:

( ) 表示分组

(ab) 表示将ab当做一个整体去处理。

\1 表示引用整个表达式中第1个分组中的正则匹配到的结果。

\2 表示引用整个表达式中第2个分组中的正则匹配到的结果。

? 表示匹配其前面的字符0或1次

  • 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。

{n} 表示前面的字符连续出现n次,将会被匹配到。

{x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。

{,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。

{n,}表示之前的字符连续出现至少n次,才会被匹配到。

看了上述总结以后,是不是已经想要放弃使用”基本正则表达式”了呢?因为与之相比,扩展正则表达式才更符合我们这些懒人的习惯,而且,扩展正则表达式的可读性也更高,毕竟很多符号少了前面的”\”,可读性就变强了。

扩展正则表达式中,还有一个常用的符号,是基本正则表达式中所没有的,它就是”|”

基本版正则

grep -e 'hello\|nihao' x.txt

扩展版正则

grep -E 'hello|nihao' x.txt
基本正则表达式和扩展正则表达式有什么区别

基本正则表达式(Basic Regular Expression,BRE)和扩展正则表达式(Extended Regular Expression,ERE)主要在以下几个方面存在区别:

  1. 字符集:在基本正则表达式中,一些字符具有特殊的含义,比如.、*、^、KaTeX parse error: Undefined control sequence: \等 at position 6: 、[ ]、\̲等̲。如果想在正则表达式中使用这些…、[ ]、\外,像 ( ) + ? | { } 这些字符也具有特殊的含义,如果想使用这些字符的字面含义,同样需要使用转义符号。

  2. 元字符的转义:在基本正则表达式中,要匹配任何有特殊含义的字符,必须使用反斜杠(\)进行转义。而在扩展正则表达式中,不需要使用反斜杠转义元字符。

  3. 重复符:在基本正则表达式中,重复操作符(如 *、+、?)只能匹配前面的子表达式零次或多次。在扩展正则表达式中,除了可以匹配零次或多次外,还可以匹配一次或多次(使用 +),以及零次或一次(使用 ?)。

  4. 选择结构:在基本正则表达式中,不能直接使用类似 a|b 的结构来表示匹配 a 或 b。而在扩展正则表达式中,可以直接使用这种选择结构。

  5. 括号:在基本正则表达式中,括号被用来分组。在扩展正则表达式中,括号被用来做更复杂的组和限定符。

  6. 其他特性:扩展正则表达式还支持前向肯定查找和后向否定查找等高级特性,而基本正则表达式不支持这些特性。



怎样用sed来给指定字段左右添加括号

sed 's/字段名/(&)/g' 文件名

在上面的命令中,将"字段名"替换为你要添加括号的字段,将"文件名"替换为你要操作的文件的名称。

这个命令将找到文件中所有出现的"字段名",然后在它们的前面添加左括号"(“,在它们的后面添加右括号”)",实现左右添加括号的效果。

请注意,这个命令会在整个文件中进行替换操作。如果你只想在特定的行中添加括号,可以结合使用sed命令的行操作符来实现。

例如,如果你想在每行的第5个字段前后添加括号,可以使用以下命令:

sed 's/\([^ ]*\) 字段名/\1 (&)/g' 文件名

在PowerShell中,你可以使用字符串替换功能来给指定字段左右添加括号。下面是一个示例:

$text = "这是一个示例字段"  
$newText = $text -replace "字段", "($&)"  
Write-Host $newText

在上面的示例中,我们定义了一个变量$text,其中包含待处理的字符串。然后,我们使用-replace操作符对字符串进行替换。"字段"是要替换的指定字段,"($&)"是替换后的结果,其中$&表示匹配到的字段。最后,我们使用Write-Host命令输出结果。

当你运行这段代码时,它会在指定的字段左右添加括号。例如,输出将会是"这是一个示例(字段)"。你可以根据需要将$text替换为你实际要处理的字符串,并根据需要修改字段的名称和替换后的结果。

请注意,PowerShell中的字符串替换功能非常强大,你可以使用正则表达式进行更复杂的替换操作。如果你需要进行更高级的字段处理,建议查阅PowerShell的相关文档以了解更多关于字符串处理和正则表达式的用法。

sed 中的 & 号

& 在 sed 中有特殊的含义,它代表整个匹配到的字符串。如果你在替换操作中使用 &,那么它会被替换成匹配到的字符串。例如,sed 's/foo/bar&/' 将会把所有出现的 “foo” 替换为 “barfoo”,而不是仅仅替换为 “bar”。

在sed命令中,&符号通常用来表示匹配到的文本。它可以在替换操作中使用,表示将匹配到的文本原封不动地插入到替换后的位置。

echo "I have an apple." | sed 's/apple/苹&果/'

输出将是:

I have an 苹apple果.

在替换操作中,&符号将被替换为匹配到的文本,即"apple"。因此,上述命令将"apple"替换为"苹apple果",并将结果输出到标准输出。

需要注意的是,&符号只有在替换操作中才有特殊含义,在其他情况下它只是一个普通字符。如果要在正则表达式中使用&符号本身,需要进行转义,例如使用"&"来表示。

给命令加上反引号

无论基本正则还是扩展正则,反引号都要用反斜杠转义

###无论基本正则还是扩展正则,反引号都要用反斜杠转义
echo "给 command 加上反引号" | sed "s/command/\`&\`/g"

echo "给 command 加上反引号" | sed -e "s/command/\`&\`/g"

echo "给 command 加上反引号" | sed -E "s/command/\`&\`/g"

结果:
给 `command` 加上反引号
sed --help | sed  -E "s/\-{1,2}[a-zA-Z\-]+/\`&\`/g"
sed --help | sed  -e "s/\-\{1,2\}[a-zA-Z\-]\+/\`&\`/g"
[root@fedora txt]# sed --help | sed  -e "s/\-\{1,2\}[a-zA-Z\-]\+/\`&\`/g"
用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...

  `-n`, `--quiet`, `--silent`
                 取消自动打印模式空间
      `--debug`
                 对程序运行进行标注
  `-e` 脚本, `--expression`=脚本
                 添加“脚本”到程序的运行列表
  `-f` 脚本文件, `--file`=脚本文件
                 添加“脚本文件”到程序的运行列表
  `--follow-symlinks`
                 直接修改文件时跟随软链接
  `-i`[扩展名], `--in-place`[=扩展名]
                 直接修改文件(如果指定扩展名则备份文件)
  `-c`, `--copy`
                 use copy instead of rename when shuffling files in `-i` mode
  `-b`, `--binary`
                 does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX
                 (open files in binary mode; CR+LF are not processed specially)
  `-l` N, `--line-length`=N
                 指定“l”命令的换行期望长度
  `--posix`
                 关闭所有 GNU 扩展
  `-E`, `-r`, `--regexp-extended`
                 在脚本中使用扩展正则表达式
                 (为保证可移植性使用 POSIX `-E`)。
  `-s`, `--separate`
                 将输入文件视为各个独立的文件而不是单个
                 长的连续输入流。
      `--sandbox`
                 在沙盒模式中进行操作(禁用 e/r/w 命令)。
  `-u`, `--unbuffered`
                 从输入文件读取最少的数据,更频繁的刷新输出
  `-z`, `--null-data`
                 使用 NUL 字符分隔各行
      `--help`     打印帮助并退出
      `--version`  输出版本信息并退出

如果没有 `-e`, `--expression`, `-f``--file` 选项,那么第一个非选项参数被视为
sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准
输入读取数据。
GNU sed 主页:<https://www.gnu.org/software/sed/>。
使用 GNU 软件的一般性帮助:<https://www.gnu.org/gethelp/>。
请将错误报告发送至:<bug`-sed`@gnu.org>
man sed | sed  -e "s/\-\{1,2\}[a-zA-Z\-]\+/\`&\`/g"
man sed | sed  -E "s/\-{1,2}[a-zA-Z\-]+/\`&\`/g"
[root@fedora txt]# man sed | sed  -E "s/\-{1,2}[a-zA-Z\-]+/\`&\`/g"
SED(1)                                                                                          用户命令                                                                                          SED(1)

名称
       sed - 文本筛选和格式转换的流式编辑器

摘要
       sed [选项]... {script‐only‐if‐no‐other‐script} [输入文件]...

描述
       Sed是一个流式编辑器。流式编辑器是用来在输入流(一个文件或者管道输入)中                                                   完成基本文本转换的。当在一些允许脚本编辑的编辑器中(比如ed),sed通过将
       输入传输为一个输入来工作,这样更高效。但是是sed的功能来过滤管道的文本并 从其他类型的编辑器中特别识别出这些文本。

       `-n`, `--quiet`, `--silent`

              不自动打印模式空间的内容

       `-e` 脚本, `--expression`=脚本

              添加脚本到将要执行的命令

       `-f` 脚本文件, `--file`=脚本文件

              添加脚本文件的内容到即将执行的命令

       `--follow-symlinks`

              处理已存在文件时跟随链接

       `-i`[SUFFIX], `--in-place`[=SUFFIX]

              编辑已存在的文件(如果提供了SUFFIX作为后缀则做备份)

       `-l` N, `--line-length`=N

              指定’l’命令需要的自动换行长度

       `--posix`

              禁用所有GNU插件。

       `-E`, `-r`, `--regexp-extended`

              在脚本中使用扩展正则表达式(为了可移植性,请使用符合POSIX的`-E``-s`, `--separate`

              将多个文件分别看待,而非统一视作同个连续的流。

       `--sandbox`

              在沙箱模式下操作。

       `-u`, `--unbuffered`

              从输入文件中读取最少量的数据并更频繁地刷新输出缓冲区

       `-z`, `--null-data`

              用NUL字符分割行

       `--help`
              显示这个帮助并退出

       `--version`
              输出版本信息并退出

       如果没有给出`-e``--expression``-f`,或者`--file`选项, 那么第一个非选项参数会被当作sed脚本解释。所有余下的参数是输入文件的名称; 如果没有指定输入文件,那么就会读取标准输入。

       GNU sed主页:<http://www.gnu.org/software/sed/>。使用GNU软件的通用帮助 :<http://www.gnu.org/gethelp/>。Bug报告请发送电子邮件至:<bug‐sed@gnu.org>。

命令摘要
       这只是为已经知道sed命令和相关文档(例如texinfo文档),需要翻阅命令完整 描述的人准备的sed命令的简短摘要。

   零地址“命令”
       : label
              b 和 t 命令的标签。

       #comment
              注释将会延长到下一个新行 (或者一个 ‐e 脚本片段的结尾。)

       }      一个{ }块的闭括号。

   零或一地址命令
       =      答应当前行的行号。

       a \

       text   追加 text, text可以通过预先写入反斜杠来嵌入新行。

       i \

       text   插入 text, text可以通过预先写入反斜杠来嵌入新行。

       q [exit‐code]
              立即退出sed脚本而不处理其他输入,除非自动打印没有禁用使得当前模式 空间将会被打印。[exit‐code]是GNU插件(扩展)。

       Q [exit‐code]
              立即退出sed脚本而不处理其他输入。这是一个GNU插件。

       r 文件名
              从 文件名 读取内容并追加到最后。

       R 文件名
              从 文件名 读取一行并追加到最后。每次调用这个命令就从文件中读取一 行。这是一个GNU插件。

   接受范围地址的命令
       {      开始一个命令块(以一个}结束)。

       b label
              程序跳转到label处;如果label被省略,跳转到脚本尾部。

       c \

       text   用 text 代替选择的行, text 可以通过预先写入反斜杠来嵌入新行。

       d      删除模式空间。 开始下一个循环。

       D      如果模式空间包含新行,在d命令发布之后开始一个新的普通循环。否则, 删除模式空间中的text直到新行,并且在不读入新行的情况下,用结果的 模式空间开始一个循环。

       h H    复制/追加模式空间到保存空间。

       g G    复制/追加保存空间到模式空间。

       l      用“直观明确”的格式列出当前行。

       l width
              用“直观明确”的格式列出当前行,在width字符处结束。这是一个GNU插件。

       n N    读取/追加下一行输入到模式空间。

       p      输出当前的模式空间。

       P      输出直到遇到当前模式空间的第一个嵌入的换行符。

       s/regexp/replacement/
              尝试与模式空间匹配regexp,如果成功,用replacement代替匹配的部分 。replacement可能包含特殊字符&来引用模式空间中匹配的部分,而特殊 字符\1\9则引用regexp中对应匹配的子表达式。

       t label
              自上次输入行读取之后并且上次执行了t或者T命令之后,如果一个s///被 成功替换,那么跳转到label处;如果label被忽略,跳转到脚本结尾。

       T label
              自上此输入行读取之后并借上次执行了t或者T命令之后,如果一个s///被 成功替换,那么跳转到label处;如果label被忽略,跳转到脚本结尾。这是 一个GNU插件。

       w filename
              将当前的模式空间写入到filename中。

       W filename
              写入当前模式空间的第一行到filename中。这是一个GNU插件。

       x      交换模式空间和保存空间的内容。

       y/source/dest/
              将模式空间中显示为source的字符用dest字符来写出。

地址
       Sed命令可以没有指定地址,这样将会为所有行执行命令。如果给出了一个地址,                                                    这样命令就只会为匹配此地址的行执行;如果给出了两个地址,这样命令将会对
       从匹配的第一个地址到第二个地址的区域的所有输入行执行命令。                       关于地址范围有三点:语法为:addr1                       ,                      addr2(比如,地址要用逗号分开);
       addr1匹配的行一定会被接受,即使addr2选定的是更靠前的行;并且如果addr2是 一个regexp(正则表达式),它将不会重复测试addr匹配的行。

       在地址(或地址范围)之后,在命令之前,可以插入一个!,这个符号定义的命令 只有在地址(地址范围)不匹配的时候才能执行。

       支持下面的地址类型:

       number 只匹配行号为number的行。(除非‐s选项在命令行中被指定,number值将 会按照文件数渐增。)

       first˜step
              匹配每一个第step行并从first开始计数。举个栗子,‘‘sed                   ‐n                    1˜2p’’将                    打印出输入流所有奇数行,而地址2˜5将匹配从第2行开始的,以5为步长的
              行。first可以是零;这样,sed按其为step来操作。(这是一个插件。)

       $      匹配最近的行。

       /regexp/
              匹配符合正则表达式regexp的行。

       \cregexpc
              匹配符合正则表达式regexp的行。 其中c可以是任意字符。

       GNUsed同样支持某些特殊2地址格式:

       0,addr2
              从“匹配了第一个地址”状态始,直到发现addr2。这和1,               addr2很相似,               除了当addr2匹配了输入的第一行,0,               addr2形式将在该范围的结尾;而               1,
              addr2形式仍然在该范围的开始。这种形式只有在addr2是正则表达式 的情况下才有效。

       addr1,+N
              将会匹配 addr1 和在 addr1 之后的 N 行。

       addr1,˜N
              将会匹配 addr1 和 addr1 之后的输入行数是 N 倍的下一行。

正则表达式
       POSIX.2       BREs应该是支持的,但是由于性能的原因,这个特性还不完全。其中        \n序列匹配换行符,\a、\t和其他序列也是类似的。‐E选项开关用来选择是否使用扩展正则        表达式;‐E选项已经由GNU
       sed支持了很多年,现已包含于POSIX中。

BUGS
       请将错误报告发送至bug‐sed@gnu.org。另外,请在邮件正文中尽量包含 ‘‘sed ‐‐version’’的信息。

作者
       由  Jay  Fenlason, Tom Lord, Ken Pizzini, 和 Paolo Bonzini写成。 GNU sed 主页: <http://www.gnu.org/software/sed/>.  使用 GNU 软件的一般性手册: <http://www.gnu.org/gethelp/>.  E‐mail bug 报告到:
       <bug‐sed@gnu.org>.

版权
       Copyright © 2017 Free Software Foundation, Inc.  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
       This is free software: you are free to change and redistribute it.  There is NO WARRANTY, to the extent permitted by law.

参见
       awk(1), ed(1), grep(1), tr(1), perlre(1), sed.info, 任何和sed相关的书籍, sed常见问题(http://sed.sf.net/grabbag/tutorials/sedfaq.txt), http://sed.sf.net/grabbag/。

       sed 的完整文档是作为Texinfo手册维护的。如果info和sed程序正确的安装, 可以执行

              info sed

       命令来访问完整的手册。

跋
       本页面中文版由中文 man 手册页计划提供。

       翻译人员:Means Lee
       翻译日期:2017‐05‐15
       原始软件:sed
       中文 man 手册页计划:https://github.com/man‐pages‐zh/manpages‐zh

sed 4.4                                                                                         2017年2月                                                                                         SED(1)
[root@fedora txt]#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kfepiza

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值