-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)主要在以下几个方面存在区别:
-
字符集:在基本正则表达式中,一些字符具有特殊的含义,比如.、*、^、KaTeX parse error: Undefined control sequence: \等 at position 6: 、[ ]、\̲等̲。如果想在正则表达式中使用这些…、[ ]、\外,像 ( ) + ? | { } 这些字符也具有特殊的含义,如果想使用这些字符的字面含义,同样需要使用转义符号。
-
元字符的转义:在基本正则表达式中,要匹配任何有特殊含义的字符,必须使用反斜杠(\)进行转义。而在扩展正则表达式中,不需要使用反斜杠转义元字符。
-
重复符:在基本正则表达式中,重复操作符(如 *、+、?)只能匹配前面的子表达式零次或多次。在扩展正则表达式中,除了可以匹配零次或多次外,还可以匹配一次或多次(使用 +),以及零次或一次(使用 ?)。
-
选择结构:在基本正则表达式中,不能直接使用类似 a|b 的结构来表示匹配 a 或 b。而在扩展正则表达式中,可以直接使用这种选择结构。
-
括号:在基本正则表达式中,括号被用来分组。在扩展正则表达式中,括号被用来做更复杂的组和限定符。
-
其他特性:扩展正则表达式还支持前向肯定查找和后向否定查找等高级特性,而基本正则表达式不支持这些特性。
怎样用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]#