【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 当作普通字符串处理,而不会引发正则表达式的解析错误。