Topic 1 替换
s/reg/replace/flags
flags:
n 1-512之间,指定第几次出现匹配时替换
g 全局
p 打印模式空间的内容
w file 将模式空间写到file中
replace: 特殊含义字符
& 用正则表达式匹配的内容进行替换
\n 匹配第n个子串,这个子串以前在pattern中用“\(”和'\)'指定
\ 转义(如& \等)
Topic 2 删除
注1:前面说过分组命令都会作用到一行上面,如果先删除那么后面的命令将不再生效!!
那么删除命令可以改变脚本的控制流。
高级删除货待续
Topic 3 追加、插入和更改
追加:a
插入:i
更改:c
[line-address]a\
text
不常用略
Topic 4 列表 l
显示模式空间的内容 l ,可以打印不可见内容如 ^M 显示为字符\r
sed -n -e 'l' file
Topic 5 转换 y 最小助记符
[address]y/abc/xyz
所有的a替换为x, 形如tr
Topic 6 打印P P命令不会影响模式空间,不改变脚本控制流,常用在改变控制流命令之前(d,N,b),如果sed不带-n参数,将会“重复”输出
#4.txt
zk "abc" #1#
zk "bcd" #2#
asf
zk "123" #3#
bbb
zk 123 #4#
#4.sed
/^\zk/{
p
s/"//g
s/#//2
s/^\zk//p
}
注意,第一个p命令只是输出了模式空间的内容,即整行;最后一个命令也是输出了模式空间的内容,即最终的处理结果,
整个sed执行完成之后模式空间的内容将输出到标准输出流,所以最终结果有两行。
如果要去掉本身的模式空间输出,使用sed的-n参数
sed -f 4.sed 4.txt
zk "abc" #1#
abc #1
abc #1
zk "bcd" #2#
bcd #2
bcd #2
asf
zk "123" #3#
123 #3
123 #3
bbb
zk 123 #4#
123 #4
123 #4
sed -nf 4.sed 4.txt
zk "abc" #1#
abc #1
zk "bcd" #2#
bcd #2
zk "123" #3#
123 #3
zk 123 #4#
123 #4
打印行号 =
sed '=' 会打印行号(没-n打印行号之后会在下一行打印原始内容)
cat 4.txt | sed '=' | sed 'N;s/\n/:/'
这样可以打印行号+内容
1:zk "abc" #1#
2:zk "bcd" #2#
3:asf
4:zk "123" #3#
5:bbb
6:zk 123 #4#
N命令将第二行追加到模式空间,那么读一行时等于 line1\nline2
使用 sed -n 'N;s/\n/xxx/' 可以转换为 line1xxxline2
echo -e "1\n2\n3\n4" | sed -n 'N;s/\n/ /;p'sed先读入第一行到pattern space,然后执行N命令,将第二行追加进pattern space
这时pattern space里面就是1\n2,然后执行s/\n/ /,将换行符替换成空格,最后打印。
Topic 7 下一步 n (有点像环视)跳过当前行模式空间,直接读取下一行进模式空间
/^zk/{
n
/^$/d
}
<span style="font-size:18px;">zk
124
123
zk
567</span>
zk
124
123
zk
567
当读到zk开头的行时,直接跳到下一行如果这一行是空行则删除。
Topic 8 r,w 读写文件(待续)
[line-address]r file 将文件内容附加到匹配行的后面,注意读入的内容不受-n限制,仍然会输出
[addrress]w file 将特定行写入到特定文件(有点像 grep -e '/reg/' > file)
/^zk/d
将8.list的内容添加到所有以zk开头的行后面,再删除原始的zk行;效果等于将所有的zk行替换为文件
---------------------------------------------------------------------
tom classA
terry classB
marry classB
tusiki classC
xiaoming classA
----------------------------------------------------------------------
分类输出,并消除类别
/classA$/{
s///
w A.txt
}
将所有A类别的行消掉类别后输出到文件A.txt里
Topic 9 退出 q 停止读取新的行(控制),它可以节约时间(终止无用循环)
e.g sed '100q' 打印1-100行 形如head
比较:
for file
do
sed 10q $file
done
-----------------------------------
for file
do
sed -n 1,10p $file
done
注意后者将10行之后也处理了,只是没有输出。
,