首页 > 系统相关 >【SHELL】sed 命令用法

【SHELL】sed 命令用法

时间:2024-10-22 09:23:36浏览次数:1  
标签:SHELL bar foo -- 用法 sed file txt

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

 

标签:SHELL,bar,foo,--,用法,sed,file,txt
From: https://www.cnblogs.com/skullboyer/p/18491838

相关文章

  • PowerShell的Runspace是一个用于执行PowerShell代码的环境。它提供了一个独立的上下文
    PowerShell的Runspace是一个用于执行PowerShell代码的环境。它提供了一个独立的上下文,允许你在其中运行命令、脚本和表达式。Runspace可以被认为是PowerShell会话的一个实例,可以在多线程环境中使用,允许你并发执行多个PowerShell任务。以下是关于PowerShellRunspace的一些关键点和......
  • Java中super关键词的用法和注意事项
    在Java中,super关键字用于引用当前对象的父类。它主要有以下几种用途:1.访问父类的属性和方法:当子类中定义了与父类同名的属性或方法时,可以使用super关键字来明确指出要访问的是父类中的属性或方法。2.调用父类的构造器:在子类的构造方法中,可以使用super()来显式调用父类的构造器,以......
  • 论文阅读-ArtVLM: Attribute Recognition Through Vision-Based Prefix Language Mode
    摘要识别并从对象中分离视觉属性是许多计算机视觉应用的基础。虽然像CLIP这样的大型视觉-语言表示在很大程度上解决了零样本对象识别的任务,但零样本视觉属性识别仍然是一个挑战,因为CLIP通过对比学习得到的视觉-语言表示无法有效捕捉对象-属性依赖关系。在本文中,我们针对这一弱点......
  • 【SHELL】grep 命令用法
    linux命令行查询grep用法信息grep--helpUsage:grep[OPTION]...PATTERNS[FILE]...SearchforPATTERNSineachFILE.Example:grep-i'helloworld'menu.hmain.cPATTERNScancontainmultiplepatternsseparatedbynewlines.Patternselectionandinte......
  • shell与会话
    当您在命令行中运行一个脚本(如`./gotobin`)时,该脚本会在一个新的子Shell中执行。这意味着脚本中的所有命令(包括`cd`命令)都仅在这个子Shell的上下文中运行。一旦脚本执行完毕,子Shell就会关闭,并且您会返回到原始的交互式Shell会话中,该会话的工作目录保持不变。这是因为`......
  • rolling 用法
    Pandas库中的`rolling`方法是一种强大的数据处理工具,主要用于执行基于滑动窗口的计算,这在时间序列数据或数据框中非常常见。以下是对`rolling`方法及其支持的函数的综合概述:###1.`rolling`方法的基本概念和用法`rolling`方法用于创建一个滚动窗口对象,该对象可以应用于数据框......
  • Shell 主要的作用是什么
    Shell主要的作用:1.提供与操作系统交互的命令行界面;2.执行和管理系统命令和程序;3.脚本编程和自动化任务;4.环境配置和用户管理;5.管理文件和目录;6.进程控制和任务调度。Shell是用户与操作系统进行交互的主要界面,为用户提供了命令行界面。1.提供与操作系统交互的命令行界面......
  • C10-08-宽字节注入-mysql注入之getshell-sqlmap
    一宽字节注入利用宽字节注入实现“库名-表名”的注入过程。靶场环境:容器镜像:area39/pikachu宽字节概念1、如果一个字符的大小是一个字节的,称为窄字节;2、如果一个字符的大小是两个及以上字节的,称为宽字节;像GB2312、GBK、GB18030、BIG5、Shift_JIS等编码都是常见的宽字节......
  • 【Python爬虫实战】深入解析BeautifulSoup4的强大功能与用法
      ......
  • shell编程小技巧:进程替换
    今天来给大家介绍一个非常好用的shell编程技巧,即进程替换(Processsubstitution)。进程替换可以将一个进程(程序)的输入或输出当做一个文件来使用。它的两种使用形式为:<(cmd)或>(cmd).需要注意的是,<和>与(之间不能有空格!下面通过一个示例来介绍进程替换的具体用法。假如我有一个......