linux脚本 sed,Linux脚本利器sed

sed

文本例子使用以下文件

$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.

像插入动作一样,可以使用行号代替模式,两种方式A完成相同的功能。

#!/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'

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值