Linux Sed 教程:有趣的 Sed 替换示例

举报
Tiamo_T 发表于 2022/01/12 16:59:39 2022/01/12
【摘要】 在本文中,让我们通过几个实际示例来了解一些在 sed 中使用“s”替代命令的有趣解决方法。

在本文中,让我们通过几个实际示例来了解一些在 sed 中使用“s”替代命令的有趣解决方法。


一、sed替换分隔符

正如我们在上一篇文章中所讨论的,我们可以使用不同的分隔符,例如 @ % | ; : 在 sed 替换命令中。

让我们首先创建将在下面提到的所有示例中使用的 path.txt 文件。

$ cat path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/omni/lbin:/opt/omni/sbin:/root/bin

示例 1 – sed @ 分隔符:将 /opt/omni/lbin 替换为 /opt/tools/bin

当您替换具有“/”的路径名时,您可以使用@ 作为分隔符而不是“/”。在下面的 sed 示例中,在输入文件的最后一行中,/opt/omni/lbin 已更改为 /opt/tools/bin。


$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/tools/bin :/opt/omni/sbin:/root/bin

示例 2 – sed / 分隔符:将 /opt/omni/lbin 替换为 /opt/tools/bin

当您应该在路径名相关替换中使用“/”时,您必须在替换数据中转义“/”,如下所示。在这个 sed 示例中,分隔符“/”在 REGEXP 和 REPLACEMENT 部分中被转义。

$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/tools/bin :/opt/omni/sbin:/root/bin

二、sed '&' 获取匹配的字符串

正则表达式匹配的输入行的精确部分由 & 表示,然后可以在替换部分中使用。

示例 1 – sed & 用法:将 /usr/bin/ 替换为 /usr/bin/local

$ sed 's@/usr/bin@&/local@g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin/: /usr/bin/local :/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin: /usr/bin/local :/opt/omni/bin:
/opt/omni/lbin:/opt/omni/sbin:/root/bin

在上面的示例中,替换部分中的“&”将替换为匹配模式的 /usr/bin,并将其添加到 /local。所以在输出中所有出现的 /usr/bin 都将替换为 /usr/bin/local

示例 2 – sed & 用法:匹配整行

& 用给定的 REGEXP 替换任何匹配项。

$ sed 's@^.*$@<<<&>>>@g' path.txt
<<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>>
<<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>>
<<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>

在上面的示例中,正则表达式具有匹配整行的“^.*$”。替换部分 <<<&>>> 分别在行首和行尾用 <<< 和 >>> 写入整行。

三、Sed 中的分组和反向引用

分组可以像普通的正则表达式一样在 sed 中使用。组用“\(”打开,用“\)”关闭。分组可以与反向引用结合使用。

反向引用是对通过分组选择的正则表达式的一部分的重用。sed 中的反向引用可用于正则表达式和替换命令的替换部分。

示例 1:仅获取每行中的第一个路径

$ sed 's/\(\/[^:]*\).*/\1/g' path.txt
/usr/kbos/bin
/usr/local/sbin
/opt/omni/lbin

在上面的示例中,\(\/[^:]*\) 匹配 first : 出现之前可用的路径。\1 替换第一个匹配的组。

示例 2:多组

在文件 path.txt 中更改文件最后一行中字段的顺序。

$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin:
/root/bin:/opt/omni/sbin:/opt/omni/lbin

在上面的命令中,$ 指定仅对最后一行进行替换。输出显示最后一行中路径值的顺序已颠倒。

示例 3:获取 /etc/passwd 文件中的用户名列表

此 sed 示例仅显示 /etc/passwd 文件中的第一个字段。

$sed 's/\([^:]*\).*/\1/' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown

示例 4:为每个单词的第一个字符加上括号

这个 sed 示例打印括号中每个单词的第一个字符。

$ echo "Welcome To The Tiamo Home" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
(W)elcome (T)o (T)he (T)iamo (H)ome

示例 5:commify 简单的数字。

让我们创建一个名为 numbers 的文件,其中包含数字列表。下面的 sed 命令示例用于将数字组合到数千。

$ cat  numbers
1234
12121
3434
123

$sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers
1,234
12,121
3,434
123
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。