sed 编辑,sed全名叫stream editor,流编辑器
# 首先了解下 正则表达式的一些最基本的东西:
^ 表示一行的开头。 如:/^#/ 以#开头的匹配。
$ 表示一行的结尾。 如:/}$/ 以}结尾的匹配。
\< 表示词首。 如:\<abc 表示以 abc 为首的詞。
\> 表示词尾。 如:abc\> 表示以 abc 結尾的詞。
. 表示任何单个字符。
* 表示某个字符出现了0次或多次。
[ ] 字符集合。 如:[abc] 表示匹配a或b或c,
[a-zA-Z] 表示匹配所有的26个字符。
如果其中有^表示反,如 [^a] 表示非a的字符
sed的常见参数:
用法: sed [-nefri] [动作]
选项:
-n : 使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上。
但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者操作)才会被列出来。
-e : 直接在命令行模式上进行sed的动作编辑。
-f : 直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作。
-r : sed的动作支持的是扩展型正则表达式的语法(默认是基础正则表达式语法)。
-i : 直接修改读取的文件内容,而不是由屏幕输出。
动作说明: [n1[,n2]]function
n1, n2 :不一定会存在,一般代表“选择进行动作的行数”,
举例来说,如果我的动作是需要在10到20行之间进行的,则“10,20[动作行为]”。
function有以下这些参数:
a :新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
c :替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行
d :删除,因为是删除,所以d后面通常不接任何参数
i :插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)
p :打印,也就是将某个选择的数据打印出来。通常p会与参数sed -n一起运行
s :替换,可以直接进行替换的工作。通常这个s的动作可以搭配正规表示法,
例如 1,20s/old/new/g
sed的实战
# s命令替换 并没有对文件的内容改变
sed "s/my/you/g" pets.txt
sed -i "s/my/you/g" pets.txt # 使用 -i 参数直接修改文件内容:
sed 's/fpdiffs.*.$//g' # fpdiffs到结尾替换为空
sed "3,6s/my/your/g" pets.txt #下面的命令只替换第3到第6行的文本。
sed 's/s/S/1' my.txt #只替换每一行的第一个s:
sed 's/s/S/2' my.txt #只替换每一行的第二个s:
sed 's/s/S/3g' my.txt #只替换第一行的第3个以后的s:
# 多种替换结合
sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt
上面的命令等价于:(注:下面使用的是sed的-e命令行参数)
sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt
# 我们可以使用&来当做被匹配的变量,然后可以在基本左右加点东西。如下所示:
sed 's/my/[&]/g' my.txt
# This is [my] cat, [my] cats name is betty
# N命令 —— 把下一行的内容纳入当成缓冲区做匹配。
sed 'N;/multipleMatches/'d total.pcr.good.fasta >final.fasta
sed 's/\tfpdiffs*$//g' 1
a命令就是append, i命令就是insert,它们是用来添加行的。
# 其中的1i表明,其要在第1行前插入一行(insert)
$ sed "1 i This is my monkey, my monkey's name is wukong" my.txt
# 其中的$a表明,其要在最后一行后追加一行(append)
$ sed "$ a This is my monkey, my monkey's name is wukong" my.txt
# 注意其中的/fish/a,这意思是匹配到/fish/后就追加一行
$ sed "/fish/a This is my monkey, my monkey's name is wukong" my.txt
# c 命令是替换匹配行
$ sed "/fish/c This is my monkey, my monkey's name is wukong" my.txt
$ sed "2 c This is my monkey, my monkey's name is wukong" my.txt
# d命令 删除匹配行
$ sed '/fish/d' my.txt
$ sed '2d' my.txt
# p命令 打印命令-你可以把这个命令当成grep式的命令
# 匹配fish并输出,可以看到fish的那一行被打了两遍,
# 这是因为sed处理时会把处理的信息输出
$ sed '/fish/p' my.txt
# 使用n参数就好了,只打印匹配行
$ sed -n '/fish/p' my.txt
[address[,address]][!]{cmd}
# address可以是一个数字,也可以是一个模式,你可以通过逗号要分隔两个address
# 表示两个address的区间,参执行命令cmd,
# 其中的+3表示后面连续3行
$ sed '/dog/,+3s/^/# /g' pets.txt
# 第二个是cmd可以是多个,它们可以用分号分开,
# 可以用大括号括起来作为嵌套命令。下面是几个例子:
# 对3行到第6行,执行命令/This/d
$ sed '3,6 {/This/d}' pets.txt
# 对3行到第6行,匹配/This/成功后,再匹配/fish/,成功后执行d命令
$ sed '3,6 {/This/{/fish/d}}' pets.txt
# 从第一行到最后一行,如果匹配到This,则删除之;如果前面有空格,则去除空格
$ sed '1,${/This/d;s/^ *//g}' pets.txt