三剑客之sed
- linux sed命令详解
- 1.简介
- 2.定址
- 3.sed选项
- 4.正则表达式元字符
- 5.具体应用
- 1、行打印
- 2、替换指定文本
- 3、插入文本行,追加文本行
- 4、sed命令的删除功能
- 5、其他命令
- 6、`sed` 的分组替换功能
- 7、sed -r或者sed -E
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
删除空行的三种方法
(1)grep -v “^$” 文件名#过滤出非空行
(2)cat 文件名 | tr -s ”\n"#压缩换行符
(3)sed '/^$/d' 文件名#删除空行
6、sed
的分组替换功能
sed
的分组替换功能允许您在正则表达式中使用圆括号 ()
来捕获一组字符作为一个整体,然后在替换字符串中通过反向引用(\n
,其中 n
是捕获组的编号)来引用这些被捕获的字符。下面是如何使用 sed
进行分组替换的示例:
字符串位置替换
除了使用分组进行替换外,sed
还可以直接通过字符位置来进行替换。例如,您可以使用 s
命令的子串替换功能来替换从特定位置开始的固定长度的子串。以下是一个示例:
**示例 **:将每行的第 .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
提供了分组和基于位置的替换功能,可以根据不同的需求灵活应用这些功能来修改文本内容。
1.分组替换字符
sed ‘$r 123.txt’ test.txt #先读取123.txt内容,然后再到test.txt的末行插入读取的所有内
容
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 选项,都可以得到相同的结果。