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

news/2024/11/7 22:46:03/

-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命令的简短摘要。零地址“命令”: labelb 和 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选项已经由GNUsed支持了很多年,现已包含于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‐zhsed 4.4                                                                                         2017年2月                                                                                         SED(1)
[root@fedora txt]#

http://www.ppmy.cn/news/1255120.html

相关文章

【开源】前后端分离的在线考试系统,支持多种部署方式

在线考试系统 https://download.csdn.net/download/mo3408/88593116 在线考试系统是一种利用网络技术&#xff0c;实现在线出题、答题、阅卷、成绩查询等一系列考试活动的系统。它不受地理位置限制&#xff0c;可以实现远程考试&#xff0c;大大提高了考试的效率和便利性。此…

【计算机概论 ①】- 电脑:辅助人脑的好工具

目录 一、电脑硬件的五大单元 二、一切设计的起点&#xff1a;CPU 的架构 三、其他单元的设备 四、运行流程 五、电脑的分类 六、电脑上面常用的计算单位&#xff08;容量、速度等&#xff09; 操作系统跟硬件有相当程度的关联性&#xff0c;所以&#xff0c;如果不了解一…

LeetCode417. Pacific Atlantic Water Flow

文章目录 一、题目二、题解 一、题目 There is an m x n rectangular island that borders both the Pacific Ocean and Atlantic Ocean. The Pacific Ocean touches the island’s left and top edges, and the Atlantic Ocean touches the island’s right and bottom edges…

在 Qt 的文本编辑类中,document() 是一个成员函数,用于获取文档对象

在 Qt 的文本编辑类中&#xff0c;document() 是一个成员函数&#xff0c;用于获取文档对象。它返回与文本编辑器关联的 QTextDocument 对象的指针。 QTextDocument 类是 Qt 中用于处理富文本内容的类。它包含了文本内容以及相关的格式、样式和布局信息。通过 document() 函数…

SmartSoftHelp8,图片版权保护工具,水印加密文件

设置水印文本内容 设置水印位置 设置水印图片内容 设置水印图片位置 对图片进行版权保护 下载地址&#xff1a; https://pan.baidu.com/s/1zBgeYsqWnSlNgiKPR2lUYg?pwd8888

免费AI洗稿软件【2023最新】

很多时候我们需要通过文字来表达观点、推广产品或服务。然而&#xff0c;长时间的文稿创作不仅费时费力&#xff0c;还容易陷入表达瓶颈。许多写手和从业者纷纷寻找一款方便、高效的AI洗稿工具。 文心一言洗稿软件。这款软件以其独特的文风生成和洗稿功能而备受瞩目。用户只需…

Rust多线程任务,发现有些线程一直获取不到锁【已解决】

问题描述 项目中用到rust&#xff0c;其中在多线程中用到了同一个对象的锁&#xff0c;然而发现其中一个线程一直拿不到这个锁。 解决过程 我先是在线程A中加入了sleep方法&#xff0c;这样做的效果就是&#xff0c;比最初好一些&#xff0c;但是拿到锁还是要较长时间&#xf…

AI创作ChatGPT源码+AI绘画(Midjourney绘画)+DALL-E3文生图+思维导图生成

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…