【SHELL】sed 命令用法

news/2024/10/22 9:27:11

linux 命令行查询 grep 用法信息

sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...-n, --quiet, --silentsuppress automatic printing of pattern space--debugannotate program execution-e script, --expression=scriptadd the script to the commands to be executed-f script-file, --file=script-fileadd the contents of script-file to the commands to be executed--follow-symlinksfollow symlinks when processing in place-i[SUFFIX], --in-place[=SUFFIX]edit files in place (makes backup if SUFFIX supplied)-l N, --line-length=Nspecify the desired line-wrap length for the l' command--posixdisable all GNU extensions.-E, -r, --regexp-extendeduse extended regular expressions in the script(for portability use POSIX -E).-s, --separateconsider files as separate rather than as a single,continuous long stream.--sandboxoperate in sandbox mode (disable e/r/w commands).-u, --unbufferedload minimal amounts of data from the input files and flushthe output buffers more often-z, --null-dataseparate 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 当作普通字符串处理,而不会引发正则表达式的解析错误。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74511.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PbootCMS备案号怎么加网站链接

站备案成功后需要在网站底部添加备案号,并且备案号需要链接到备案查询页面。以下是具体的操作步骤: 操作步骤 1. 后台填写备案号登录后台:打开浏览器,输入你的PbootCMS后台地址,登录后台管理系统。填写备案号:在后台管理界面,进入“系统设置” -> “站点设置”。 找到…

PbootCMS缓存如何清理runtime文件夹下经常满怎么办?清理缓存的方法

方式一:通过后台清理缓存登录后台:打开浏览器,输入你的PbootCMS后台地址,登录后台管理系统。清理缓存:登录后,在右上角找到“清理缓存”按钮,点击即可自动清理所有缓存文件。方式二:通过FTP或服务器直接删除runtime文件夹下的所有文件连接FTP服务器:使用FTP客户端(如…

PbootCMS中常见的错误提示及其解决方案

PbootCMS 是一个功能强大的内容管理系统,但在使用过程中可能会遇到各种错误提示。以下是一些常见的 PbootCMS 错误提示及其可能的解决方案: 常见错误提示及解决方案 1. 数据库连接错误 错误提示: 数据库连接失败解决方案:检查数据库配置文件(通常位于 /config/database.ph…

mysql主从复制详细部署

1、异步复制:这是MySQL默认的复制模式。在这种模式下,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理。这种模式的优点是实现简单,但缺点是如果主库崩溃,已经提交的事务可能没有传到从库,导致数据不一致。2、全同步复制:在这种…

Java反序列化 - CC1链 (代码审计)

R### 一、环境准备: Java环境:Java_1.8.0_8u65 Apache Commons Collections 3.2.2版本 二、漏洞简述: cc链是Apache commons collections反序列漏洞利用链的简称。可以通过构造恶意类,利用Java反序列化漏洞进行RCE。 漏洞复现: CC1链源头:org.apache.commons.collections…

PbootCMS网站怎么修改HTML模板文件

修改HTML文件连接FTP服务器:使用FTP客户端连接到你的服务器。定位模板文件夹:导航到 /template/你的模板名称/ 目录。 找到需要修改的HTML文件。编辑HTML文件:下载需要修改的HTML文件到本地。 使用文本编辑器打开并修改HTML文件。 例如,修改某个段落的文本:html<p>这…

大型零售连锁企业如何进行 合理的经销商文件发放管理?

大型零售连锁企业在市场经济中扮演着重要角色,为了业务能正常有效开展,大型零售连锁企业需要与其经销商进行频繁的业务交流和合作沟通,在这个沟通基础上,会产生大量的文件交换需求,其中,大型零售连锁企业需要外发许多文件到下游诸多经销商,包括: 经销商合作协议:这是双…

zlibrary网站镜像,2024年国内可访问地址持续更新

Z-Library是一家广受欢迎的电子图书馆,拥有庞大的电子书资源,被誉为全球最大的免费电子书网站之一。其数字档案库涵盖了超过千万本书籍,包括各种学科领域的经典名著、学术著作、小说等,用户可以在此免费下载所需的电子书。该图书馆的功能十分强大,拥有一个像Google一样的搜…