文本处理工具sed编辑器

1.sed基本命令格式bash

sed options script  file

sed 命令选项app

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

2.sed选项编辑器

2.1替换选项sthis

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

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/flagsssr

flags有4种:3d

  • 数字,代表新文本将替换第几处模式匹配的地方   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中

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

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

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

2.2使用地址ip

默认状况下,sed编辑器中的命令会做用于全部行,若想只做用于特定某行或某些行,必须用行寻址ci

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.
相关文章
相关标签/搜索