您的位置:首页 > 其它

sed摘录note

2011-01-18 13:46 218 查看
声明:以下是从网上搜的一些内容,比较杂乱,主要是方便以后查阅,如果能给您带来方便那是最好不过了,如果您发现有侵权的地方,请您告诉我,我会删除此帖。

主要是从以下地址摘录的。

推荐阅读原文。

http://bbs.chinaunix.net/thread-452942-1-1.html

s e d是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝
" 抽取域。
" 匹配正则表达式。
" 比较域。
" 增加、附加、替换。
" 基本的s e d命令和一行脚本
sed与awk相同的是既可以用sed命令也可以写成sed脚本,sed操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕

sed怎样读取数据
s e d从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束

sed [选项] s e d命令 输入文件
在命令行使用s e d命令时,实际命令要加单引号。s e d也允许加双引号
sed [选项] -f sed脚本文件 输入文件
sed -f myscript.sed input_file
s e d脚本文件[选项] 输入文件

保存sed输出
sed ‘some-sed-commands’ input-file > myoutfile

2.2 使用sed在文件中查询文本的方式
1) 使用行号,可以是一个简单数字,或是一个行号范围。
2 ) 使用正则表达式

sed编辑命令

p 打印匹配行
= 显示文件行号
a / 在定位行号后附加新文本信息
i / 在定位行号后插入新文本信息
d 删除定位行
c / 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句

sed和正则表达式

s e d识别任何基本正则表达式和模式及其行匹配规则。记住规则之一是:如果要定位一特殊字符,必须使用( /)屏蔽其特殊含义

替换文本
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p 缺省s e d将所有被替换行写入标准输出,加p选项将使- n选项无效。
- n选项不打印输出结果。
w 文件名使用此选项将输出定向到一个文件。

下面是一些一行命令集。([ ]表示空格, [ ]表示t a b键)
‘s / / . $ / / g’ 删除以句点结尾行
‘-e /abcd/d’ 删除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替
‘s / ^ [ ] [ ] * / / g’ 删除行首空格
‘s / / . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格
‘/ ^ $ / d’ 删除空行
‘s / ^ . / / g’ 删除第一个字符
‘s /CO L / ( . . . / ) / / g’ 删除紧跟C O L的后三个字母
‘s / ^ / / / / g’ 从路径中删除第一个/
‘s / [ ] / [ ] / / g’ 删除所有空格并用t a b键替代
‘S / ^ [ ] / / g’ 删除行首所有t a b键
‘s / [ ] * / / g’ 删除所有t a b键

表达式 描述
/./ 将与包含至少一个字符的任何行匹配
/../ 将与包含至少两个字符的任何行匹配
/^#/ 将与以 ‘#’ 开始的任何行匹配
/^$/ 将与所有空行匹配
/}^/ 将与以 ’}’(无空格)结束的任何行匹配
/} *^/ 将与以 ‘}’ 后面跟有零或多个空格结束的任何行匹配
/[abc]/ 将与包含小写 ’a’、’b’ 或 ‘c’ 的任何行匹配
/^[abc]/ 将与以 ’a’、’b’ 或 ’c’开始的任何行匹配

字符类 描述
[] 字母数字 [a-z A-Z 0-9]
[] 字母 [a-z A-Z]
[] 空格或制表键
[] 任何控制字符
[] 数字 [0-9]
[] 任何可视字符(无空格)
[] 小写 [a-z]
[] 非控制字符
[] 标点字符
[] 空格
[] 大写 [A-Z]
[] 十六进制数字 [0-9 a-f A-F]

新版本的sed(GNU sed version 4.0.5)带有-i选项,允许直接编辑修改文件内容而不需要重定向到临时文件
如:a.txt:
old
aaa

sed -i ‘s/old/new/’ a.txt

cat a.txt
new
abc

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:00.
The local nurse Miss P.Neave was in attendance.

sed -n ‘2p’ quote.txt
sed -n ‘1,3p’ quote.txt
打印模式
sed -n ‘/The/p’ quote.txt

使用模式和行号进行查询
sed -n ‘4,/The/p’ quote.txt
指定行找不到符合条件的,就从下一行开始查找,直到找到为止,并把,找到行之前的全部打打印出来
如果指定行本身就符合条伯,把本行及后面的行的全部打印出来

匹配元字符
sed -n ‘//$/p’ quote.txt

显示整个文件
sed -n ‘1,$p’ quote.txt

任意字符
sed -n ‘/.*ing/p’ quote.txt
首行
sed -n ‘1p’ quote.txt
最后一行
sed -n ‘$p’ quote.txt
打印行号
sed -e ‘/music/=’ quote.txt
sed -n ‘/music/=’ quote.txt
sed -n -e ‘/music/p’ -e ‘/music/=’ quote.txt

a.sed:
#!/bin/sed -f
/company/ a/Then suddenly it happed.

./a.sed quote.txt

sed “/company/i/Utter confusion followed.” quote.txt
或者
#!/bin/sed -f
4 i/Utter confusion followed.

#!/bin/sed -f
3 c/The office Dibble band played well.

#!/bin/sed -f

1 c/The Dibble band were grooving.
/evening/ i/They played some great tunes.
3 a/Where was the nurse to help?

删除文本
[ a d d r e s s [,a d d r e s s ] ] d

sed ‘1d’ quote.txt
sed ‘1,3d’ quote.txt
sed ‘$d’ quote.txt
sed ‘/Neave/d’ quote.txt

替换文本
[ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p 缺省s e d将所有被替换行写入标准输出,加p选项将使- n选项无效。
- n选项不打印输出结果。
w 文件名使用此选项将输出定向到一个文件。

sed ‘s/night/NIGHT/’ quote.txt
sed ‘s//$//’ quote.txt
sed ‘s/The/Wow!/g’ quote.txt
sed ‘s/splendid/SPLENDID/w sed.out’ quote.txt

使用替换修改字符串
sed -n ‘s/nurse/“hello” &/p’ quote.txt
sed -n ‘s/played/from Hockering &/p’ quote.txt

将sed结果写入文件命令
[ a d d r e s s [,address]]w filename
sed ‘1,2 w filedt’ quote.txt
sed ‘/Neave/ w dht’ quote.txt

从文件中读文本
address r filename
echo “Boom boom went the music” >sedex.txt
sed ‘/company./r sedex.txt’ quote.txt

匹配后退出
address q
sed ‘/.a.*/q’ quote.txt

显示文件中的控制字符
sed -n ‘1,$l’ dos.txt

处理控制字符
sed ‘s/##/ /g’ dos.txt
删除所有行首的0。使用^符号表示模式从行首开始, ^ 0 表示行首任意个0。模式s / ^ 0 * / / g设置替换部分为空,即为删除模式
sed ’s/##/ /g;s/^0
/ /g’ dos.txt
最后去除行尾^ M符号,为此需做全局替换。设置替换部分为空
sed ‘s/##/ /g;s/^0*/ /g;s/^M/ /g’ dos.txt

cat dos.txt | sed ‘s/^0*/ /g’ | sed ‘s/^M/ /g’ | sed ‘s/##/ /g’

1) 使用s / – * / / g删除横线- – - – - -。
2) 使用/ ^ $ / d删除空行。
3) 使用$ d删除最后一行
4) 使用1 d删除第一行。
5) 使用awk {print $1}打印第一列。

cat data.txt |sed ‘s/—*/ /g’ | sed ‘/^$/d’ | sed ‘$d’ | sed ‘1d’ | awk ‘{print $1}’

sed ‘s/[0-9][0-9]*/& Passed/g’ ok.txt

从shell向sed传值
[sam@chenwy sam]$ NAME=“It’s a go situation”
[sam@chenwy sam]$ REPLACE=“GO”
[sam@chenwy sam]$ echo $NAME | sed “s/go/$REPLACE/g”

从sed输出中设置shell变量
[sam@chenwy sam]$ NAME=“It’s a go situation”
[sam@chenwy sam]$ REPLACE=“GO”
[sam@chenwy sam]$ NEW_NAME=`echo $NAME | sed “s/go/$REPLACE/g”`
[sam@chenwy sam]$ echo $NEW_NAME

下面是一些一行命令集。([ ]表示空格, [ ]表示t a b键)
‘s / / . $ / / g’ 删除以句点结尾行
‘-e /abcd/d’ 删除包含a b c d的行
‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替
‘s / ^ [ ] [ ] * / / g’ 删除行首空格
‘s / / . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格
‘/ ^ $ / d’ 删除空行
‘s / ^ . / / g’ 删除第一个字符
‘s /CO L / ( . . . / ) / / g’ 删除紧跟C O L的后三个字母
‘s / ^ / / / / g’ 从路径中删除第一个/
‘s / [ ] / [ ] / / g’ 删除所有空格并用t a b键替代
‘S / ^ [ ] / / g’ 删除行首所有t a b键
‘s / [ ] * / / g’ 删除所有t a b键

删除第一个/:
echo $PWD |sed ‘s/^////g’

将"Mr Wi l l i s “字串返回给s e d并在M r后而追加” B r u c e "。
echo “Mr Willis” |sed ‘s/Mr /& Bruce/g’

e d删除字符串“a c c o u n t s . d o c”首字符

echo “accounts.doc” |sed ‘s/^.//g’

s e d删除“a c c o u n t s . d o c”文件扩展名
echo “accounts.doc”|sed ‘s/.doc//g’

增加文件扩展名
echo “accounts”|sed ‘s/$/.doc/g’

替换字符系列
x=“Department+playroll&Building G”
echo $x |sed ‘s//+/ of /g’ |sed ‘s//&/ Located at /g’

sed -e ‘1d’ /etc/services | more
sed -e ‘1,10d’ /etc/services | more
sed -e ‘/^#/d’ /etc/services | more

规则
表达式 描述
/./ 将与包含至少一个字符的任何行匹配
/../ 将与包含至少两个字符的任何行匹配
/^#/ 将与以 ‘#’ 开始的任何行匹配
/^$/ 将与所有空行匹配
/}^/ 将与以 ’}’(无空格)结束的任何行匹配
/} *^/ 将与以 ‘}’ 后面跟有零或多个空格结束的任何行匹配
/[abc]/ 将与包含小写 ’a’、’b’ 或 ‘c’ 的任何行匹配
/^[abc]/ 将与以 ’a’、’b’ 或 ’c’开始的任何行匹配

sed -e ‘/^#/d’ /etc/services | more

sed -n -e ‘/^#/p’ /path/to/my/test/file | more
sed -n -e ‘/BEGIN/,/^END/p’ /my/test/file | more
sed -n -e ‘/main[[:space:]]*(/,/^}/p’ sourcefile.c | more
替换!
sed -e ‘s/foo/bar/’ myfile.txt
sed -e ‘s/foo/bar/g’ myfile.txt
sed -e ‘1,10s/enchantment/entrapment/g’ myfile2.txt
sed -e ‘/^$/,/^END/s/hills/mountains/g’ myfile3.txt
sed -e ‘s:/usr/local:/usr:g’ mylist.txt
sed -e ‘s/usr/local/usrg’ mylist.txt

规则表达式混乱
sed -e ‘s/<.*>//g’ myfile.html
sed -e ‘s/<[^>]*>//g’ myfile.html

‘[a-x]*’
这将匹配零或多个全部为 ’a’、’b’、’c’…’v’、’w’、’x’ 的字符。另外,可以使用 ‘[]’ 字符类来匹配空格。以下是可用字符类的相当完整的列表:

字符类 描述
[] 字母数字 [a-z A-Z 0-9]
[] 字母 [a-z A-Z]
[] 空格或制表键
[] 任何控制字符
[] 数字 [0-9]
[] 任何可视字符(无空格)
[] 小写 [a-z]
[] 非控制字符
[] 标点字符
[] 空格
[] 大写 [A-Z]
[] 十六进制数字 [0-9 a-f A-F]

高级替换功能

组合使用
sed -n -e ‘=;p’ myfile.txt
sed -n -e ‘=’ -e ‘p’ myfile.txt
sed -n -f mycommands.sed myfile.txt

sed -e ‘s/$//r/’ myunix.txt > mydos.txt sed -e ‘s/.$//’ mydos.txt > myunix.txt

1d /^^/d s/[[]]//g /^D/ {
s/^D/(./)//1/tOUTY/tINNY/t/
s/^01/Jan/ s/^02/Feb/
s/^03/Mar/ s/^04/Apr/
s/^05/May/ s/^06/Jun/
s/^07/Jul/ s/^08/Aug/
s/^09/Sep/ s/^10/Oct/
s/^11/Nov/ s/^12/Dec/
s:^/(.
/)//(./)//(./):/2 /1 /3: }

1d /^^/d s/[[]]//g /^D/ {
s/^D/(./)//1/tOUTY/tINNY/t/
s/^01/Jan/ s/^02/Feb/
s/^03/Mar/ s/^04/Apr/
s/^05/May/ s/^06/Jun/
s/^07/Jul/ s/^08/Aug/
s/^09/Sep/ s/^10/Oct/
s/^11/Nov/ s/^12/Dec/
s:^/(.
/)//(./)//(./):/2 /1 /3:
N N N
s//nT/(./)/nN/(./)/nP/(./)/NUM/2NUM/t/tY/t/t/3/tAMT/1AMT/
s/NUMNUM/-/ s/NUM/([0-9]
/)NUM//1/
s//([0-9]/),//1/ }

s//nT/(./)/nN/(./)/nP/(.*/)/NUM/2NUM/t/tY/t/t/3/tAMT/1AMT/

最终的“QIF 到文本”脚本 1d /^^/d s/[[]]//g /^D/ { s/^D/(./)//1/tOUTY/tINNY/t/
s/^01/Jan/ s/^02/Feb/ s/^03/Mar/ s/^04/Apr/ s/^05/May/
s/^06/Jun/ s/^07/Jul/ s/^08/Aug/ s/^09/Sep/ s/^10/Oct/
s/^11/Nov/ s/^12/Dec/ s:^/(.
/)//(./)//(./):/2 /1 /3:
N N N s//nT/(./)/nN/(./)/nP/(./)/NUM/2NUM/t/tY/t/t/3/tAMT/1AMT/
s/NUMNUM/-/ s/NUM/([0-9]
/)NUM//1/ s//([0-9]/),//1/
/AMT-[0-9].[0-9]AMT/b fixnegs
s/AMT/(./)AMT//1/ s/OUTY/-/ s/INNY/inco/
b done :fixnegs s/AMT-/(.
/)AMT//1/ s/OUTY/misc/
s/INNY/-/ :done }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: