您的位置:首页 > 其它

文本处理工具sed编辑器

2016-05-27 22:37 295 查看
1.sed基本命令格式

sed options script  file

sed 命令选项

选项描述
-e script在处理输入时,将script中指定的命令加载到运行命令中
-f file在处理输入时,将file文件中指定的命令加载到运行命令中
-n不要为每个命令生成输出,等待print命令来输出
2.sed选项

2.1替换选项s

基本格式:s/para1/para2/ s命令会用斜线间隔文本字符串,第二个代替第一个 一般只替换掉一行中匹配的第一个文本字符串

1.处理一行文本
$echo "this is a test test" | sed 's/test/exam/'
this is a exam test

2.处理一个文件中的多行文本
$cat data1
this is a test
this is a test
this is a test
$sed 's/test/exam/'  data1
this is a exam
this is a exam
this is a exam

3.使用多个编辑命令
$sed -e 's/this/that/; s/test/exam/'  data1    #用;号隔开,前一个命令末尾和分好之间不能有空格
that is a exam
that is a exam
that is a exam
也可以改为
$sed -e '
>s/this/that/
>s/test/exam/' data1    #引号开始引号结束
that is a exam
that is a exam
that is a exam

4.从文件中读取编辑命令
$cat script1
s/this/that/
s/test/exam/
$ sed -f script1 data1
that is a exam
that is a exam
that is a exam

用替换标记flag的格式: s/pattern/replacement/flags

flags有4种:

数字,表明新文本将替换第几处模式匹配的地方 sed 's/test/exam/2'

g,表明新文本将会替换所有已有文本出现的地方 sed 's/test/exam/g'

p,原来的行的内容要打印出来,一般与-n一起用,只打印匹配的行 sed 's/test/exam/2'

w file,将替换的结果写到文件中 ,sed 's/test/exam/w data2' 处理后的数据写入data2中

遇到特殊字符,特殊处理!

$sed 's/\/bin\/bash/\bin\/dash'  /etc/passwd

#用!代替/之后的命令:容易读取和理解,注意最后一个!
$$sed 's!/bin/bash!bin/dash!'  /etc/passwd

2.2使用地址

默认情况下,sed编辑器中的命令会作用于所有行,若想只作用于特定某行或某些行,必须用行寻址

sed编辑器的2中行寻址

行的数字范围

用文本模式来过滤出某行

命令格式: address command 也可以多行

address {
command1
command2
command3
}

举栗子

$cat data2
You are a girl 1
I am a girl 2
I am a girl 3
I am a girl 4

#替换一行
$sed '2s/girl/boy/' data2
You are a girl 1
I am a boy 2
I am a girl 3
I am a girl 4

#替换多行用逗号分隔
$sed '2,3s/girl/boy/' data2
You are a girl 1
I am a boy 2
I am a boy 3
I am a girl 4

#替换到最后一行用$命令
$sed '2,$s/girl/boy/' data2
You are a girl 1
I am a boy 2
I am a boy 3
I am a boy 4

#文本匹配
$sed '/You/s/girl/boy/' data2
You are a boy 1
I am a girl 2
I am a girl 3
I am a girl 4

#组合命令
$sed '2{
>s/I/You/
>s/am/are/
>s/girl/boy/
>}' data2
You are a boy 1
You are a boy 2
I am a girl 3
I am a girl 4

2.3删除行命令d

sed编辑器不会修改原始文件,删除的行只是从sed编辑器的输出中消失了。

#删除一行
$sed '3d'  data2     #删除第2行
You are a girl 1
I am a girl 3
I am a girl 4

$sed '2,3d'  data2   #删除第2.3行
$sed '3,$d'  data2   #删除第3到最后行
$sed '/You/d'  data2  #删除You所在行

#注意,删除用两个文本模式来匹配的行时,第一个匹配模式打开删除功能,第二个匹配模式关闭删除功能,两个匹配模式之间的行都会被删
$sed '/1/,/3/d'  data2
I am a girl 4

2.4插入i和附加a文本命令

插入(insert)命令i会在指定行前增加一个新行

追加(append)命令会在制定行后增加一个新行

$sed '3i\you are a dog' data2  #\去掉后,执行结果一样,为阅读方便,加\
You are a boy 1
I am a girl 2
you are a dog
I am a girl 3
I am a girl 4

$sed '3a\you are a dog' data2
You are a boy 1
I am a girl 2
I am a girl 3
you are a dog
I am a girl 4

2.5修改行C

与插入和附加类似,修改数据流中的整行文本。

$sed '3c\you are a dog' data2  #\去掉后,执行结果一样,为阅读方便,加\
You are a boy 1
I am a girl 2
you are a dog
I am a girl 4

$sed '2,3c\you are a dog' data2   #将2个匹配模式之间的行换成要替换的文本。
You are a boy 1
you are a dog
I am a girl 4

2.6转换命令y

转换命令y是唯一可以处理单个字符的sed编辑器命令,

格式: addressy/inchars/outchars/ 其中inchars和outchars值一对一映射,inchars中第一个地府转换成outchars中第一个字符,以此类推

$sed 'y/123/678/' data2  #\去掉后,执行结果一样,为阅读方便,加\
You are a boy 6
I am a girl 7
I am a girl 8
I am a girl 4

y转换命令是一个全局命令,它会自动转换文本中找到的所有匹配值,无法限定只更改该字符出现的某个地方

$echo "this 1 is a test 1" | sed 'y/123/456/'
this 4 is a test 4

2.7打印命令p = l

p打印出sed编辑器输出中的一行

=打印行号

l用来列出行,允许打印文本和不可打印的ASCII字符 \t 等
$sed '=' data2  #\去掉后,执行结果一样,为阅读方便,加\
1
You are a boy 1
2
I am a girl 2
3
I am a girl 3
4
I am a girl 4

$sed -n 'l' data2    #会打印出本句结束符$
You are a boy 1$
I am a girl 2$
I am a girl 3$
I am a girl 4$


2.8 sed与文件一起工作写w读r

格式:addressw filename filename文件必须有写的权限

addressr filename filename文件必须有读的权限

$sed -n '2,3w test' data2
$cat test
I am a girl 2
I am a girl 3

$sed '3r test' data2
You are a girl 1
I am a girl 2
I am a girl 3
I am a girl 2   #注意这里是从test读出来的
I am a girl 3
I am a girl 4

文件读文件的命令r filename 可以与删除命令d一起使用,替换占用文本

$ cat letter
There are those people:
LIST
will come to school.

$ sed '/LIST/{        #data3中存放着3行数据分别为John May Shliy
>r data3              #注意:r和d不能交换位置,否则不成功
>d
>}' letter
There are those people:
John
May
Shliy
will come to school.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: