Linux sed(Stream Editor)是一种强大的文本处理工具,它在命令行中执行对文本进行搜索、替换和编辑等操作。sed的设计理念是按行处理文本,可以将输入文本逐行读取并应用指定的操作,然后输出结果。
sed命令有多种选项和功能,下面将详细介绍其常用的用法和实例。
-
替换文本:
使用s/old/new/
模式实现替换操作,将输入文本中的"old"字符串替换为"new"字符串。例如:$ sed 's/foo/bar/' input.txt
这将把文件input.txt中的所有"foo"替换为"bar"。
sed支持全局替换,只需在
s/old/new/
的第一个斜杠后加入g
标志。例如:$ sed 's/foo/bar/g' input.txt
这将替换所有出现的"foo"为"bar"。
-
删除行:
使用d
命令删除匹配模式的行。例如:$ sed '/pattern/d' input.txt
这将删除文件input.txt中匹配模式"pattern"的所有行。
-
插入和追加文本:
使用i
命令在指定行前插入文本,使用a
命令在指定行后追加文本。例如:$ sed '3i\This is line 3' input.txt
这将在文件input.txt的第三行前插入文本"This is line 3"。
$ sed '3a\This is line 4' input.txt
这将在文件input.txt的第三行后追加文本"This is line 4"。
-
打印文本:
使用p
命令打印匹配模式的行。例如:$ sed -n '/pattern/p' input.txt
这将打印文件input.txt中匹配模式"pattern"的所有行。
如果想要打印所有行,可以使用以下命令:
$ sed -n 'p' input.txt
-
文件编辑:
使用-i
选项实现原地编辑,即直接修改源文件而不产生新的输出文件。例如:$ sed -i 's/foo/bar/' input.txt
这将直接在输入文件input.txt中将所有的"foo"替换为"bar"。
-
制定处理范围:
可以使用行地址指定sed命令的处理范围。例如,使用数字表示行号:$ sed '2,5d' input.txt
这将删除文件input.txt的第二行到第五行之间的内容。
也可以使用正则表达式指定处理范围。例如,处理以"start"开始和以"end"结束之间的文本:
$ sed '/start/,/end/d' input.txt
这将删除文件input.txt中匹配模式"start"和"end"之间的文本。
-
多重编辑命令:
可以使用分号将多个sed命令组合在一起。例如:$ sed 's/foo/bar/; s/abc/xyz/' input.txt
这将先将文件input.txt中的所有"foo"替换为"bar",然后将所有"abc"替换为"xyz"。
也可以将多个编辑命令写入一个脚本文件,并通过
-f
选项来执行。例如,将编辑命令存储在script.sed文件中:$ sed -f script.sed input.txt
-
指定行号进行操作:
使用数字表示的行号(如1、2、3等)可以指定要对其进行操作的行。例如,以下命令将替换文件input.txt中的第二个"foo"字符串:$ sed '2s/foo/bar/' input.txt
-
引用特殊字符:
在替换操作中,如果要引用包含特殊字符的字符串,可以使用反斜杠进行转义。例如,将"$100"替换为"$200"的命令如下:$ sed 's/\$100/\$200/' input.txt
-
根据正则表达式匹配和替换:
可以使用正则表达式作为sed命令中的匹配模式。例如,替换所有以数字开头的行为空行:$ sed 's/^[0-9].*$/ /' input.txt
-
仅显示替换的行:
使用-n选项可以禁止sed的默认输出,然后使用p命令打印匹配行。例如,只显示替换操作后的行:$ sed -n 's/foo/bar/p' input.txt
-
处理多个文件:
使用多个文件名作为sed命令的参数,可以对多个文件进行批量处理。例如,将文件1.txt和2.txt中的所有"foo"替换为"bar":$ sed 's/foo/bar/' 1.txt 2.txt
-
反向引用匹配:
使用正则表达式的捕获组和反向引用,可以在替换操作中使用匹配的内容。例如,将文件input.txt中的"a123b"替换为"b123a":$ sed 's/\(a\)\([0-9]\+\)\(b\)/\3\2\1/' input.txt
-
删除空白行:
使用以下命令可以删除文件中的空白行:$ sed '/^\s*$/d' input.txt
-
执行脚本文件:
创建一个包含sed命令的文本文件,并使用-f
选项来执行该脚本文件。例如,将编辑命令存储在script.sed文件中并执行:$ sed -f script.sed input.txt