sed命令
sed处理文本的默认流程
sed命令的语法格式
-n :默认情况下,sed打印所有已处理的输入(除了已被命令(如d)修改/删除的输入)。 使用-n可以抑制输出,使用p命令可以打印特定的行。
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r :支持扩展表达式
-i :直接修改文件内容
-
命令行执行格式:
sed [option] 'sed command' filename
-
脚本脚本格式
sed [option] -f 'sed script' filename
sed的编辑命令
使用sed进行文本的增删改查
💡 sed以行为单位进行文本处理
sed '/(查询规则)/(增删改字符)'
-
查
格式 含义 x 查询第x行 x, y 查询x行到y行 /pattern 查询满足模式的行 /pattern /pattern 查询包含两个模式的行 pattern/,x 从起始行到第x行查询包含模式的行 x,/pattern/ 从第x行开始模式查询匹配的行 x,y! 查询不包含指定行号x到y的行 -
增:新增行。使用命令i,a
-
删:删除行。使用命令d
-
改:修改行。使用命令c,s
使用示例(前加!表示不执行)
-
p命令
sed '/pattern/p' #打印匹配的行,除了把文件内容打印出来还额外打印一遍匹配pattern的行,要只输出处理结果,应加上-n选项
-
d命令
sed '/pattern/d' #删除匹配的行
-
n,N命令
n读取下一行到pattern space。由于pattern space中有按照正常流程读取的内容,使用n命令后,pattern space中又有了一行,此时,pattern space中有2行内容,但是先读取的那一行不会被删除;当n命令后,还有其他命令p的时候,此时打印出的结果是n命令读取的那一行的内容。
N的作用是读取下一行的内容到模式空间(pattern space),可以理解为sed这时候把两行读入成中间带\n的一行内容,原本sed的执行原理是逐行读取到模式空间,N促使sed把下一行内容也同时读取到模式空间待命。
原来N还有另外一个特性:当无法处理下一行内容时,N则会中止退出,所以后面的命令也不会再执行。
$!N 对最后一行不再执行N命令,但是会继续执行命令,
💡 sed使用n命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何sed命令都将应用到匹配行紧接着的下一行上。
sed '/pattern/{n;s/pattern1/pattern2/;}' datafile #将pattern匹配行的下一行应用s/pattern1/pattern2/
-
s命令
💡
/pattern/s/pattern1/pattern2/ #查找匹配的行,将该行第一个匹配pattern1的字符串替换为pattern2
/pattern/s/pattern1/pattern2/g #查找匹配的行,将该行所有匹配pattern1的字符串替换为pattern2sed 's/123/hello/' 1.txt #将每行中第一个匹配的123替换为hello sed 's/123/hello/g' 1.txt #将每行中所有匹配的123替换为hello sed 's/123/hello/2' 1.txt #将每行中第二个匹配的123替换为hello
-
r命令
sed '3r 2.txt' 1.txt #在1.txt的第3行之后插入文件2.txt的内容(可用于向文件中插入内容) sed '/245/r 2.txt' 1.txt #在匹配245的行之后插入文件2.txt的内容,如果1.txt中有多行匹配456则在每一行之后都会插入
-
$符号
💡
$符号出现在匹配规则中时表示最后一行
$符号出现在处理规则中时表示一行的末尾 -
~符号
sed '1~2d' 1.txt #从第一行开始删除,每隔2行就删掉一行,即删除奇数行
-
+符号
sed '/123/,+1d' 1.txt #删除匹配123的行及其后面一行
-
;符号
💡 若需要对某个文件应用多个规则,则可以使用分号
sed 's/^#.*//;/^$/d' 1.txt #先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开
等价于
sed -e'sed command' -e 'sed command' ... filename
-
&符号
sed 's/^[0-9]/(&)/' 1.txt #将每一行中行首的数字加上一个小括号(^[0-9])表示行首是数字,&符号代表匹配的内容
-
{}符号
sed '1,3{/123/d}' 1.txt #删除1~3行中匹配内容123的行,1,3表示匹配1~3行,{/123/d}表示删除匹配123的行 sed -n '/error/{=;p}' 1.txt #打印匹配error的行的行号和内容