【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 是处理文本流的利器,能高效地完成各种替换、删除、插入等操作

选项详细解释

  1. -n, --quiet, --silent
    作用: 关闭自动输出,默认情况下 sed 会自动输出处理过的每一行,使用 -n 后,只有明确使用 p(print)命令时才会输出结果。
    示例

    # 输出文件中包含 "hello" 的行
    sed -n '/hello/p' file.txt

    解释-n 禁止自动打印,/hello/ 匹配含有 "hello" 的行,p 打印匹配的行。

  2. --debug
    作用: 以注解的方式显示 sed 的执行过程,帮助调试脚本。
    示例

    sed --debug 's/foo/bar/' file.txt

    解释:当你使用 sed 修改内容时,它会显示调试信息,以便你了解脚本是如何执行的。

  3. -e script, --expression=script
    作用: 在命令行中直接指定 sed 脚本。这个选项允许你在命令中编写多个 sed 表达式。
    示例

    sed -e 's/foo/bar/' -e 's/hello/world/' file.txt

    解释:这个命令将文件中的 foo 替换为 bar,然后将 hello 替换为 world

  4. -f script-file, --file=script-file
    作用: 从指定的脚本文件中读取 sed 命令。
    示例

    sed -f script.sed file.txt

    解释script.sed 是包含多个 sed 命令的脚本文件,sed 会按顺序执行这些命令。

  5. --follow-symlinks
    作用: 当你编辑文件并指定 -i(原地编辑)时,sed 会跟随符号链接(symlink)指向的实际文件进行编辑。
    示例

    sed -i --follow-symlinks 's/foo/bar/' symlink.txt

    解释:如果 symlink.txt 是一个符号链接文件,sed 会编辑它指向的实际文件。

  6. -i[SUFFIX], --in-place[=SUFFIX]
    作用: 直接在文件中进行编辑,而不是输出到标准输出。可选地提供 SUFFIX,则在修改前创建文件的备份。
    示例

    sed -i.bak 's/foo/bar/' file.txt

    解释:直接在 file.txt 中将 foo 替换为 bar,并创建一个备份文件 file.txt.bak

  7. -l N, --line-length=N
    作用: 当使用 l 命令(列出行内容)时,指定输出的行宽(N 表示字符数)。
    示例

    echo "hello world" | sed -l 5 'l'

    解释:使用 l 命令显示 "hello world",但每行最多显示 5 个字符。

  8. --posix
    作用: 禁用 GNU 扩展,使 sed 遵循 POSIX 标准语法。
    示例

    sed --posix 's/foo/bar/' file.txt

    解释:这将禁用 sed 的一些非标准特性,确保脚本在 POSIX 环境下工作。

  9. -E, -r, --regexp-extended
    作用: 使用扩展的正则表达式(ERE),这与基本正则表达式(BRE)相比,简化了一些语法(例如不用转义括号和 +)。
    示例

    echo "abc123" | sed -E 's/[a-z]+([0-9]+)/\1/'

    解释:使用扩展正则表达式,匹配并提取字母后面的数字。

  10. -s, --separate
    作用: 将多个输入文件视为独立的流,而不是作为一个连续的流处理。
    示例

    sed -s 's/foo/bar/' file1.txt file2.txt

    解释sed 会分别处理 file1.txtfile2.txt,而不是将它们作为一个整体处理。

  11. --sandbox
    作用: 以沙盒模式运行,禁止使用 e, r, w 命令,防止 sed 修改文件或执行外部命令。
    示例

    sed --sandbox 's/foo/bar/' file.txt

    解释:启用沙盒模式,防止 sed 脚本执行危险的操作。

  12. -u, --unbuffered
    作用: 减少从输入文件读取数据时的缓冲区大小,并更频繁地刷新输出。
    示例

    sed -u 's/foo/bar/' file.txt

    解释:立即将处理结果输出到标准输出,而不是等到处理大量数据后再输出。

  13. -z, --null-data
    作用: 将输入中的行分隔符从换行符 \n 改为 NUL 字符 \0,这在处理二进制数据或以 NUL 作为分隔符的文本时很有用。
    示例

    sed -z 's/foo/bar/' file.txt

    解释:使用 NUL 字符作为行分隔符处理文本。

  14. --help
    作用: 显示帮助信息并退出。
    示例

    sed --help

    解释:显示 sed 的帮助信息,列出所有可用选项。

  15. --version
    作用: 显示 sed 的版本信息并退出。
    示例

    sed --version

    解释:显示 sed 的版本号。


典型用法示例

  1. 替换文本

    sed 's/foo/bar/' file.txt

    解释:将 file.txt 中的第一个 foo 替换为 bar,并将结果输出到标准输出。

  2. 直接修改文件并备份

    sed -i.bak 's/foo/bar/' file.txt

    解释:在文件中进行替换,同时创建 file.txt.bak 备份。

  3. 删除匹配行

    sed '/foo/d' file.txt

    解释:删除 file.txt 中包含 foo 的所有行。

  4. 从脚本文件读取命令

    sed -f commands.sed file.txt

    解释:从 commands.sed 文件中读取多个 sed 命令,并应用于 file.txt

  5. 多次替换

    sed -e 's/foo/bar/' -e 's/baz/qux/' 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 的替换命令组成:

sed 's/[.[\*^$(){}?+|]/\\&/g'

可以分为几部分来解读:

  • s: 代表 sed 的替换命令(substitute),它的基本结构是 s/原始模式/替换模式/
  • /[.[\*^$(){}?+|]/: 匹配的正则表达式模式,用来寻找需要替换的字符。
  • /\\&/: 替换的内容,这里 \\& 是对匹配到的字符进行转义。
  • /g: 全局替换,表示替换所有匹配的地方,而不仅仅是第一个。

正则表达式解释

[.[\*^$(){}?+|]

  • 方括号 []: 方括号定义了一个字符类,表示“匹配方括号内的任意一个字符”,在这里,我们列出了所有正则表达式中具有特殊含义的字符,需要对它们进行转义。

字符集内的内容解释如下:

  • .: 点号,表示“任意一个字符”,在正则表达式中是通配符。
  • [: 开始方括号,表示字符集,具有特殊含义。为了在替换中处理它,必须转义它。
  • \: 反斜杠,正则表达式中用于转义其它特殊字符,但在 sed 中我们需要两次反斜杠(\\),因为一个是给 sed 自己转义,另一个是给正则表达式。
  • *: 星号,表示前面的字符可以重复0次或多次。在正则中是量词。
  • ^: 插入符,表示行首,在正则中也是特殊字符。
  • $: 美元符,表示行尾,在正则表达式中具有特殊意义。
  • (): 圆括号,表示捕获组,正则表达式用来分组匹配。
  • {}: 大括号,用于指定匹配的重复次数范围。
  • ?: 问号,表示前面的字符是可选的(匹配0次或1次)。
  • +: 加号,表示前面的字符至少要匹配一次(1次或更多次)。
  • |: 竖线,表示“或者”的逻辑运算符。

总结:这个字符类 [.[\*^$(){}?+|] 列出了正则表达式中所有常见的特殊字符,它告诉 sed,只要匹配到其中的任何一个字符,就要进行替换。

替换部分:\\&

  • &: 在 sed 的替换部分中,& 代表“当前匹配的整个字符串”。因此,当你用 & 时,sed 会将匹配到的字符原样放回去。

  • \\: 双反斜杠的作用是转义下一个字符。在这里,转义是为了使 & 作为普通字符出现在替换结果中,而不是 sed 默认的匹配字符。反斜杠用于转义匹配到的特殊字符,使它们在替换后不再具有正则表达式的意义,而是作为普通字符。

g 选项

  • g: 全局替换标志,表示每行中所有出现的匹配字符都会被替换,而不仅仅是第一个。

例子

假设有一个变量 pattern="foo$bar(baz)",并且你希望将这个字符串中的特殊字符 $() 作为普通字符处理而不是正则表达式。

  1. 首先,[.[\*^$(){}?+|] 将会匹配字符串中的 $( 以及 )
  2. 然后,通过 \\& 进行替换,将这些匹配到的字符转义。
  3. 结果就是字符串变成了 "foo\$bar\(baz\)",这时字符串中的 $() 已经被转义,可以在后续处理中当作普通字符来对待。

总结

sed 's/[.[\*^$(){}?+|]/\\&/g' 的核心作用是将变量中的正则表达式特殊字符转义为普通字符,从而使它们可以被 sed 当作普通字符串处理,而不会引发正则表达式的解析错误。

 

posted @ 2024-10-22 09:26  壹点灵异  阅读(41)  评论(0编辑  收藏  举报