【Shell语言学堂】sed命令最全详解


linux sed命令详解

CSDN@划过手的泪滴t


1.简介

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
执行时,sed会从文件或者标准输入中读取一行,将其复制到缓冲区,对文本编辑完成之后,读取下一行直到所有的文本行都编辑完毕。
所以sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i选项或者将结果重定向到新的文件中。

sed命令的基本语法如下:

sed [options] commands [inputfile...]

2.定址

定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

地址是一个数字,则表示行号;是“$"符号,则表示最后一行。例如:

sed -n '3p' datafile
#只打印第三行

地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。例如:

sed '2,5d' datafile
#删除第二到第五行
sed '/My/,/You/d' datafile
#删除包含"My"的行到包含"You"的行之间的行
sed '/My/,10d' datafile
#删除包含"My"的行到第十行的内容

3.sed选项

选项 功能
-e 进行多项编辑,即对输入行应用多条sed命令时使用
-n 取消默认的输出
-f 指定sed脚本的文件名
-i 直接编辑原文件
-l 指定行的长度
-r 在脚本中使用扩展表达式

执行多条命令的格式:

sed -e '操作1' -e '操作2' 文件
sed -n -e '/^r/p' -e '/^b/p' /etc/passwd

sed -e '操作1;操作2' 文件

sed命令的操作符
在这里插入图片描述

4.正则表达式元字符

在这里插入图片描述

5.具体应用

sed命令比较适用于大的文本文件,用普通文本编辑器难以胜任的情况。下面分别介绍直接打印、插入、删除、替换等编辑操作。

1、行打印

输出缓冲区内容,使用sed的p 子命令
p子命令代表print,可以打印出sed缓冲区内的内容。
sed命令中,直接采用数字代表某个特定的文本行:'1 p’代表打印第一行;'1,3 p’代表打印1到3行;特别的,最后一行的行号为$。

不使用-n选项时,sed命令把1到3行输出了两次。这是因为不使用-n时,sed首先读取一行,并默认将缓冲区内的文本输出出来,之后p子命令再次输出。使用-n时,默认输出取消,只有p子命令的输出结果。

sed -n '1,3 p' test1.txt
sed -n '1~2 p' test1.txt
#1~2表示从第一行开始,行号递增2输出,即输出奇数行。语法格式为first~step。

打印奇数行或偶数行
方法1:

 sed -n 'p;n' test.txt  #奇数行 
 sed -n 'n;p' test.txt  #偶数行 

方法2:

 sed -n '1~2p' test.txt  #奇数行 
 sed -n '2~2p' test.txt  #偶数行 

指定打印第几行往下几行
格式:sed -n 'n,+np' 文件名

2、替换指定文本

使用s子命令
这一个命令实用性很广,并且灵活。语法也比之上面特别一些:

sed '位置参数 s/pattern/replaced/[flag]'

pattern为要替换的文本,支持正则表达式,replaced表示用来替换的一般字符串(不支持正则表达式)。

flag是替换标志,用来影响匹配替换的规则:

flag 用法

g 全局匹配,会替换文本行中所有匹配的字符串 十进制n 替换文本行中第n个匹配的字符串
p 替换第一个匹配的字符串,并且将缓冲区输出到标准输出 w 替换第一个匹配的字符串,并且将改动的行输出到磁盘文件中
缺省 替换第一个匹配的字符串

3、插入文本行,追加文本行

这两种情况很类似。插入文本使用i子命令,表示在指定位置前面插入文本;追加文本使用a子命令,表示在指定位置之后插入文本。

  • a:在下一行添加内容
sed '/添加的行/a 添加的内容' 文件名
  • i:在上一行插入内容
sed '/添加的行/i 添加的内容' 文件名

变形:y命令
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:

 sed '1,10y/abcde/ABCDE/' file

4、sed命令的删除功能

删除操作:d命令
删除空白行:

 sed '/^$/d' file

删除文件的第2行:

 sed '2d' file

删除文件的第2行到末尾所有行:

 sed '2,$d' file

删除文件最后一行:

 sed '$d' file

删除文件中所有开头是test的行:

 sed '/^test/'d file

5、其他命令

写入文件:w命令
在example中所有包含test的行都被写入file里:

 sed -n '/test/w file' example

从文件读入:r命令
file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:

 sed '/test/r file' filename
sed '$r 123.txt' test.txt #先读取123.txt内容,然后再到test.txt的末行插入读取的所有内容

删除空行的三种方法

(1)grep -v “^$” 文件名#过滤出非空行
(2)cat 文件名 | tr -s\n"#压缩换行符
(3)sed '/^$/d' 文件名#删除空行

6、sed 的分组替换功能

sed 的分组替换功能允许您在正则表达式中使用圆括号 () 来捕获一组字符作为一个整体,然后在替换字符串中通过反向引用(\n,其中 n 是捕获组的编号)来引用这些被捕获的字符。下面是如何使用 sed 进行分组替换的示例:

字符串位置替换

除了使用分组进行替换外,sed 还可以直接通过字符位置来进行替换。例如,您可以使用 s 命令的子串替换功能来替换从特定位置开始的固定长度的子串。以下是一个示例:

示例1 :将每行的第 .png 结尾的单词替换为 .jpg:

echo "This is an image.png file." | sed 's/\(\w*\).png/\1.jpg/g'

这里,\(\w*\) 匹配并捕获一个或多个单词字符(字母、数字或下划线),直到遇到 “.png”。替换字符串 \1.jpg 使用反向引用 \1 引用捕获的单词字符,将 “.png” 替换为 “.jpg”。

示例 2:将每行的第五个到第七个字符替换为 “XYZ”:

echo "0123456789ABCDEF" | sed 's/^\(....\)\(...\)/\1XYZ/g'

这里,^\(....\)\(...\) 匹配行首的前四个字符(\(....\))作为第一捕获组,接着匹配并捕获接下来的三个字符(\(...\))作为第二捕获组。替换字符串 \1XYZ 保留第一捕获组的内容,并将第二捕获组的内容替换为 “XYZ”。

综上所述,sed 提供了分组和基于位置的替换功能,可以根据不同的需求灵活应用这些功能来修改文本内容。

分组替换字符
echo bbxx | sed -r 's/(bb)(xx)/\2\1/'

在这里插入图片描述

echo 你喜欢我 | sed -r 's/(.)(.)(.)(.)/\4\2\3\1/'

7、sed -r或者sed -E

sed -r 是 sed 命令的一个选项,用于启用扩展(extended)正则表达式(ERE)。在某些 sed 实现中(如 GNU sed),使用 -r 或 -E 选项可以使 sed 解析器接受扩展正则表达式的语法,相比基本正则表达式(BRE),扩展正则表达式提供了更丰富、更直观的正则表达式语法。

在您提到的场景——将文件中的所有连续空格替换为单个空格——中,使用 -r 选项并非必需,因为该任务可以使用基本正则表达式轻松完成。不过,如果您已经习惯使用扩展正则表达式的语法,也可以在命令中加入 -r 选项:

sed -r 's/ +/ /g' file > output_file

这里的替换命令 s/ +/ /g 与之前的基本正则表达式版本 s/ + / /g 功能相同,都是查找并替换所有连续的空格为单个空格。主要区别在于:

在扩展正则表达式中,连续空格的表示方式更为简洁,不需要在重复量词(+)前加反斜杠进行转义。
使用 -r 选项后,其他扩展正则表达式的特性(如 | 表示逻辑或、() 用于分组等)也可以在 sed 命令中直接使用,而无需额外的反斜杠转义。
总之,sed -r 是一个开启扩展正则表达式支持的选项,使得 sed 命令能够理解并处理扩展正则表达式的语法。在实际使用时,根据个人习惯和具体需求选择是否启用该选项。对于替换连续空格的任务,无论是否使用 -r 选项,都可以得到相同的结果。


在这里插入图片描述

  • 34
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值