【SHELL】sed 命令用法
linux 命令行查询 grep 用法信息
sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
-n, --quiet, --silent
suppress automatic printing of pattern space
--debug
annotate program execution
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
--follow-symlinks
follow symlinks when processing in place
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
-l N, --line-length=N
specify the desired line-wrap length for the l' command
--posix
disable all GNU extensions.
-E, -r, --regexp-extended
use extended regular expressions in the script
(for portability use POSIX -E).
-s, --separate
consider files as separate rather than as a single,
continuous long stream.
--sandbox
operate in sandbox mode (disable e/r/w commands).
-u, --unbuffered
load minimal amounts of data from the input files and flush
the output buffers more often
-z, --null-data
separate lines by NUL characters
--help display this help and exit
--version output version information and exit
sed
是处理文本流的利器,能高效地完成各种替换、删除、插入等操作
选项详细解释
-
-n, --quiet, --silent
作用: 关闭自动输出,默认情况下sed
会自动输出处理过的每一行,使用-n
后,只有明确使用p
(print)命令时才会输出结果。
示例:解释:
-n
禁止自动打印,/hello/
匹配含有 "hello" 的行,p
打印匹配的行。 -
--debug
作用: 以注解的方式显示sed
的执行过程,帮助调试脚本。
示例:解释:当你使用
sed
修改内容时,它会显示调试信息,以便你了解脚本是如何执行的。 -
-e script, --expression=script
作用: 在命令行中直接指定sed
脚本。这个选项允许你在命令中编写多个sed
表达式。
示例:解释:这个命令将文件中的
foo
替换为bar
,然后将hello
替换为world
。 -
-f script-file, --file=script-file
作用: 从指定的脚本文件中读取sed
命令。
示例:解释:
script.sed
是包含多个sed
命令的脚本文件,sed
会按顺序执行这些命令。 -
--follow-symlinks
作用: 当你编辑文件并指定-i
(原地编辑)时,sed
会跟随符号链接(symlink)指向的实际文件进行编辑。
示例:解释:如果
symlink.txt
是一个符号链接文件,sed
会编辑它指向的实际文件。 -
-i[SUFFIX], --in-place[=SUFFIX]
作用: 直接在文件中进行编辑,而不是输出到标准输出。可选地提供SUFFIX
,则在修改前创建文件的备份。
示例:解释:直接在
file.txt
中将foo
替换为bar
,并创建一个备份文件file.txt.bak
。 -
-l N, --line-length=N
作用: 当使用l
命令(列出行内容)时,指定输出的行宽(N 表示字符数)。
示例:解释:使用
l
命令显示 "hello world",但每行最多显示 5 个字符。 -
--posix
作用: 禁用 GNU 扩展,使sed
遵循 POSIX 标准语法。
示例:解释:这将禁用
sed
的一些非标准特性,确保脚本在 POSIX 环境下工作。 -
-E, -r, --regexp-extended
作用: 使用扩展的正则表达式(ERE),这与基本正则表达式(BRE)相比,简化了一些语法(例如不用转义括号和+
)。
示例:解释:使用扩展正则表达式,匹配并提取字母后面的数字。
-
-s, --separate
作用: 将多个输入文件视为独立的流,而不是作为一个连续的流处理。
示例:解释:
sed
会分别处理file1.txt
和file2.txt
,而不是将它们作为一个整体处理。 -
--sandbox
作用: 以沙盒模式运行,禁止使用e
,r
,w
命令,防止sed
修改文件或执行外部命令。
示例:解释:启用沙盒模式,防止
sed
脚本执行危险的操作。 -
-u, --unbuffered
作用: 减少从输入文件读取数据时的缓冲区大小,并更频繁地刷新输出。
示例:解释:立即将处理结果输出到标准输出,而不是等到处理大量数据后再输出。
-
-z, --null-data
作用: 将输入中的行分隔符从换行符\n
改为 NUL 字符\0
,这在处理二进制数据或以 NUL 作为分隔符的文本时很有用。
示例:解释:使用 NUL 字符作为行分隔符处理文本。
-
--help
作用: 显示帮助信息并退出。
示例:解释:显示
sed
的帮助信息,列出所有可用选项。 -
--version
作用: 显示sed
的版本信息并退出。
示例:解释:显示
sed
的版本号。
典型用法示例
-
替换文本:
解释:将
file.txt
中的第一个foo
替换为bar
,并将结果输出到标准输出。 -
直接修改文件并备份:
解释:在文件中进行替换,同时创建
file.txt.bak
备份。 -
删除匹配行:
解释:删除
file.txt
中包含foo
的所有行。 -
从脚本文件读取命令:
解释:从
commands.sed
文件中读取多个sed
命令,并应用于file.txt
。 -
多次替换:
解释:在一次
sed
调用中执行多个替换操作。
sed 转义字符串中的转义字符
现有一变量接收来自其他的输入,即变量内容不可知,很可能包括转义字符,如果使用sed命令直接匹配删除,可能无法满足
sed 命令是否支持某个选项,类似 grep 命令的 -F 选项,直接将变量内容当作纯字符串对待
很可惜 没有!
但可以将变量内容先转义,再给sed命令处理
pattern="[-] d6ef7e3 ref | MAST-1234 > 优化[mic]使用方式"
# 使用 sed 转义 pattern 中的特殊字符
escaped_pattern=$(echo "$pattern" | sed 's/[.[\*^$(){}?+|]/\\&/g')
# 然后使用转义后的变量进行 sed 匹配和删除
sed "/$escaped_pattern/d" test.txt
详细解释 sed 's/[.[\*^$(){}?+|]/\\&/g'
命令的工作原理
结构分析
这个命令是由 sed
的替换命令组成:
可以分为几部分来解读:
s
: 代表sed
的替换命令(substitute),它的基本结构是s/原始模式/替换模式/
。/[.[\*^$(){}?+|]/
: 匹配的正则表达式模式,用来寻找需要替换的字符。/\\&/
: 替换的内容,这里\\&
是对匹配到的字符进行转义。/g
: 全局替换,表示替换所有匹配的地方,而不仅仅是第一个。
正则表达式解释
[.[\*^$(){}?+|]
- 方括号
[]
: 方括号定义了一个字符类,表示“匹配方括号内的任意一个字符”,在这里,我们列出了所有正则表达式中具有特殊含义的字符,需要对它们进行转义。
字符集内的内容解释如下:
.
: 点号,表示“任意一个字符”,在正则表达式中是通配符。[
: 开始方括号,表示字符集,具有特殊含义。为了在替换中处理它,必须转义它。\
: 反斜杠,正则表达式中用于转义其它特殊字符,但在sed
中我们需要两次反斜杠(\\
),因为一个是给sed
自己转义,另一个是给正则表达式。*
: 星号,表示前面的字符可以重复0次或多次。在正则中是量词。^
: 插入符,表示行首,在正则中也是特殊字符。$
: 美元符,表示行尾,在正则表达式中具有特殊意义。(
和)
: 圆括号,表示捕获组,正则表达式用来分组匹配。{
和}
: 大括号,用于指定匹配的重复次数范围。?
: 问号,表示前面的字符是可选的(匹配0次或1次)。+
: 加号,表示前面的字符至少要匹配一次(1次或更多次)。|
: 竖线,表示“或者”的逻辑运算符。
总结:这个字符类 [.[\*^$(){}?+|]
列出了正则表达式中所有常见的特殊字符,它告诉 sed
,只要匹配到其中的任何一个字符,就要进行替换。
替换部分:\\&
-
&
: 在sed
的替换部分中,&
代表“当前匹配的整个字符串”。因此,当你用&
时,sed
会将匹配到的字符原样放回去。 -
\\
: 双反斜杠的作用是转义下一个字符。在这里,转义是为了使&
作为普通字符出现在替换结果中,而不是sed
默认的匹配字符。反斜杠用于转义匹配到的特殊字符,使它们在替换后不再具有正则表达式的意义,而是作为普通字符。
g
选项
g
: 全局替换标志,表示每行中所有出现的匹配字符都会被替换,而不仅仅是第一个。
例子
假设有一个变量 pattern="foo$bar(baz)"
,并且你希望将这个字符串中的特殊字符 $
和 ()
作为普通字符处理而不是正则表达式。
- 首先,
[.[\*^$(){}?+|]
将会匹配字符串中的$
和(
以及)
。 - 然后,通过
\\&
进行替换,将这些匹配到的字符转义。 - 结果就是字符串变成了
"foo\$bar\(baz\)"
,这时字符串中的$
和(
、)
已经被转义,可以在后续处理中当作普通字符来对待。
总结
sed 's/[.[\*^$(){}?+|]/\\&/g'
的核心作用是将变量中的正则表达式特殊字符转义为普通字符,从而使它们可以被 sed
当作普通字符串处理,而不会引发正则表达式的解析错误。