sed
0 本文例子使用以下文件
$pg quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
1 sed怎样读取数据
sed从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条
命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束。
2 调用sed
调用sed有三种方式:
在命令行键入命令;
将sed命令插入脚本文件,然后调用sed;
将sed命令插入脚本文件,并使sed脚本可执行。
使用sed命令行格式为:
sed [选项] sed命令 输入文件
记住在命令行使用sed命令时,实际命令要加单引号。sed也允许加双引号。
使用sed脚本文件,格式为:
sed [选项] -f sed脚本文件 输入文件
要使用第一行具有sed命令解释器的sed脚本文件,其格式为:
sed脚本文件 [选项] 输入文件
不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。
sed选项如下:
n 不打印;sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以用来打印编辑行。
c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条sed命令,此选项无用,但指定它也没有关系。
f 如果正在调用sed脚本文件,使用此选项。此选项通知sed一个脚本文件支持所有的sed命令,
例如:sed -f myscript.sed input_file,这里myscript.sed即为支持sed命令的文件
2.1 使用sed在文件中查询文本的方式
sed浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
1) 使用行号,可以是一个简单数字,或是一个行号范围。
2) 使用正则表达式。
使用sed在文件中定位文本的方式
x x为一行号,如1
x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
/pattern/ 查询包含模式的行。例如/disk/或/[a-z]/
/pattern/pattern/ 查询包含两个模式的行。例如/disk/disks/
pattern/,x 在给定行号上查询包含模式的行。如/ribbon/,3
x,/pattern/ 通过行号和模式查询匹配行。 3,/vdu/
x,y! 查询不包含指定行号x和y的行。1,2!
2.2 基本sed编辑命令
sed编辑命令
p 打印匹配行
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
d 删除定位行
c\ 用新文本替换定位文本
s 使用替换模式替换相应模式
& 与s配合使用,在行中插入文本
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制ASCII代码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句
2.3 打印文本 example
$sed -n '2p' quote.txt (打印第二行)
$sed -n '$p' quote.txt (打印最后一行)
$sed -n '1,3p' quote.txt (打印第1~3行)
$sed -n '/Neave/'p quote.txt (打印匹配Neave的行)
$sed -n '4,/The/'p quote.txt (在第四行匹配模式The,若匹配,则打印)
$sed -n '/\$/'p quote.txt (匹配元字符$)
$sed -n '1,$'p quote.txt (打印整个文件,只需将行范围设为第一行到最后一行1,$. $意为最后一行)
$sed -n '/.*ing/'p quote.txt (任意字符:使用模式/.*ing/查询以ing结尾的任意单词)
$sed -n '/music/=' quote.txt (打印匹配行的行号)
$sed -n -e '/music/p' -e '/music/=' quote.txt (打印匹配行的内容和行号)
$sed '=' quote.txt | tail -2 (显示行数或最大行号)
2.4 创建sed脚本文件 || sed用法
2.4.1附加文本 a\
$chmod u+x append.sed
$pg append.sed
#!/bin/sed -f
/company/ a\
Then suddenly it happened.
运行脚本:$append.sed quote.txt
第二行以/company/开始,这是附加操作起始位置. a\通知sed这是一个附加操作,首先应插入一个新行。第三行是附加操作
要加入到拷贝的实际文本。输出显示附加结果。
2.4.2插入文本 i\
插入命令类似于附加命令,只是在指定行前面插入。和附加命令一样,它也只接受一个地址。
下面脚本使用行号指定文本插入位置,插入位置在模式或指定行号4之前。脚本如下:
#!/bin/sed -f
4 i\
Utter insert ok.
2.4.3修改文本 c\
修改命令将在匹配模式空间的指定行用新文本加以替代
将第一行The honeysuckle band played all night long for only $90替换为The office Dibble band played well。首先要
匹配第一行的任何部分,可使用模式'/Honeysuckle/'。sed脚本文件为change.sed。内容如下:
$pg change.sed
#!/bin/sed -f
/Honeysuckle/ c\
The office Dibble band played well.
像插入动作一样,可以使用行号代替模式,两种方式完成相同的功能。
#!/bin/sed -f
3 c\
The office Dibble band played well.
2.4.4删除文本 d
sed删除文本格式:[address[,address]]d
地址可以是行的范围或模式,example as:
$sed '1d' quote.txt 删除第一行
$sed '1,3'd quote.txt 删除第一到第三行
$sed '$d' quote.txt 删除最后一行
$sed '/Neave/d' quote.txt 删除包含文本'Neave'的行
$sed '-e/Neave/d' quote.txt 删除包含文本'Neave'的行
2.4.5替换文本 s
替换命令用替换模式替换指定模式,格式为:[address[,address]] s/pattern-to-find/replacement-pattern/[g p w n]
s选项 通知sed这是一个替换操作,并查询pattern-to-find,成功后用replacement-pattern替换它。
替换选项如下:
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p 缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。
-n 选项不打印输出结果。
w 文件名使用此选项将输出定向到一个文件。
example:
$sed 's/night/NIGHT/' quote.txt (替换night为NIGHT(第一个) )
$sed 's/\$//' quote.txt (替换$符号为空白--即删除$符号)
$sed 's/The/hehe/g' quote.txt (替换所有的The为hehe)
$sed 's/night/lghti/w sed.out' quote.txt (替换结果写入文件sed.out)
2.4.6 使用替换文本模式插入 (&)
如果要附加或修改一个字符串,可以使用(&)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面。
即先给出一个被替换模式,然后是一个准备附加在第一个模式后的另一个模式,并且后面带有&,这样修改模式将放在匹配模
式之前。例如,sed语句s/nurse/"Hello" &/p 的结果如下:
$sed -n 's/nurse/"Hello" &/p' quote.txt
此句在nurse 之前加上"Hello "
$sed 's/[0-9][0-9]*/& Passwd/g' ok.txt
此句在文本ok.txt中,在所有的单个或连续数字后面加上'Passwd'.
$sed 's/[0-9][0-9][0-9]*/& Passwd/g' ok.txt
此句在文本ok.txt中,在所有的2个或2个以上连续数字后面加上'Passwd'.
2.4.7 从文件中读文本 r
$sed '/company/r sedin.txt' quote.txt (在quote.txt的匹配行后插入文本sedin.txt的内容)
2.4.8 首次匹配后退出 q
$sed '/.a.*/q' quote.txt (匹配"任意字符后跟字符a,再跟任意字符0次或任意多次",首次匹配后退出)
2.5 使用系统sed
sed的基本功能,但是在脚本或命令行中使用sed真正要做的是修改或删除文件或字符串中文本。
2.5.1 处理控制字符
使用sed实现的一个重要功能是在另一个系统中下载的文件中剔除控制字符。
下面是传送过来的文件(dos.txt)的部分脚本, 必须去除所有可疑字符,以便于帐号所有者使用文件。
$pg dos.txt
12332##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##34.46^M
进行如下操作:
1) 用一个空格替换所有的(##)符号。
2) 除起始域中最前面的0(00)。
3) 删除行尾控制字符(^M)。
4) 删除行首数字
一些系统中,回车符为^@和^L,如果遇到一些怪异的字符,不必担心,只要是在行尾并且全都相同就可以。
按步执行每一项任务,以保证在进行到下一任务前得到理想结果。使用输入文件dos.txt。
任务1 删除所有的#字符很容易,可以使用全局替换命令。这里用一个空格替换两个或更多的#符号。
$sed 's/##*/ /g' dos.txt (s -- 替换 ; g -- 所有 )
12332 DISO 45.12^M
00332 LPSO 23.11^M
01299 USPD 34.46^M
任务2 删除所有行首的0。 ^0*表示行首任意个0。模式s/^0*//g设置替换部分为空,即为删除模式,正是要求所在。
$sed 's/^0*//g' dos.txt
12332##DISO##45.12^M
332##LPSO##23.11^M
1299##USPD##34.46^M
任务3 最后去除行尾^M符号,为此需做全局替换。设置替换部分为空。模式为:'s/^m/ /g',注意'^M',这是一个控制字符。
要产生控制字符(^M),需遵从前面产生F1键同样的处理过程。步骤如下;键入sed s/,然后按住键和v键,释放v键,
再按住^键,并保持键不动,再释放两个键,最后按键。下面命令去除行尾^M字符。
$sed 's/^M//g' dos.txt
以上三步,也可使用一条命令实现:
$cat dos.txt | sed 's/##*/ /g' |sed 's/^0*//g' |sed 's/^M//g'
放在脚本里实现如下:
$pg dos.sed
#!/bin/sed -f
### to call : dos.sed dos.txt
s/##*/ /g
s/^0*//g
s/\^M//g
#### END
任务4 删除行首数字
$sed 's/^[0-9]*//g' dos.txt
2.5.2 处理报文输出
当从数据库中执行语句输出时,一旦有了输出结果,脚本即可做进一步处理。通常先做一些整理,下面是一个sql查询结果。
Database size date created
------------------------------
gosouth 2244 12/11/97
trisud 5632 8/9/99
(2 rows affected)
为了使用上述输出信息做进一步自动处理,需要知道所存数据库名称,为此需执行以下操作:
1) 使用s/-*//g删除横线------。
2) 使用/^$/d删除空行。 (注意空行表示为^$)
3) 使用$d删除最后一行
4) 使用1d删除第一行。
5) 使用awk {print $1}打印第一列。
命令如下,这里使用了cat,并管道传送结果到sed命令。
$ cat sql.txt | sed 's/-*//g' | sed '/^$/d' | sed '$d' | sed '1d' | awk '{print $1}'
gosouth
trisud
2.5.3 从shell向sed传值
要从命令行中向sed传值,值得注意的是用双引号,否则功能不执行。
$NAME="It's a go situation"
$REPLACE="GO"
$echo $NAME | sed "s/go/$REPLACE/g"
It's a GO situation
2.5.4 从sed输出中设置shell变量
从sed输出中设置shell变量是一个简单的替换过程。运用上面的例子,创建shell变量NEW_NAME,保存上述sed例子的输出结果。
$NAME="It's a go situation"
$REPLACE="GO"
$NEW_NAME= 'echo $NAME | sed "s/go/$REPLACE/g"'
$echo $NEW_NAME
It's a GO situation
2.6 快速命令
下面是一些一行命令集。([h]表示空格,[ ]表示tab键)
's/.$//g' 删除结尾最后一个字符
's/\.$//g' 删除结尾句点
'/\.$/d' 删除以句点结尾行
'/.$/d' 删除所有行
'/^./d' 删除所有行
'-e/abcd/d' 删除包含abcd的行
's/[][][]*/[]/g' 删除一个以上空格,用一个空格代替
's/^[][]*//g' 删除行首空格
's/\.[][]*/[]/g' 删除句点后跟两个或更多空格,代之以一个空格
'/^$/d' 删除空行 (仅有空格的行不能删除)
'/^[[:space:]]*$/d' 删除空行 (包括仅有空格的行)
's/^.//g' 删除第一个字符
's/COL\(...\)//g' 删除COL及紧跟COL的后三个字母
's/COL...//g' 删除COL及紧跟COL的后三个字母
's/^\///g' 从路径中删除第一个\
's/[]/[ ]/g' 删除所有空格并用tab键替代
's/^[ ]//g' 删除行首所有tab键
's/[ ]*//g' 删除所有tab键
example:
1. 删除路径名第一个\符号
将当前工作目录返回给sed,删除第一个\:
$pwd | sed 's/^\///g'
2. 追加/插入文本
将"Mr Willis"字串返回给sed并在Mr后而追加"Bruce"。
$echo "Mr Willis" | sed 's/Mr/& Bruce/g'
3. 删除首字符
sed删除字符串"accounts.doc"首字符。
$echo "accounts.doc" | sed 's/^.//g'
4. 删除文件扩展名
sed删除"accounts.doc"文件扩展名。
$echo "accounts.doc" | sed 's/\....//g'
5. 增加文件扩展名
sed附加字符串".doc"到字符串"accounts"。
$echo "accounts" | sed 's/$/.doc/g'
阅读(921) | 评论(0) | 转发(0) |