sed命令基本用法
1. sed简介
sed是一种流式编辑器,流编辑器会根据在编辑器处理数据之前事先提供的规则集来编辑数据流。它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件原本内容并没有改变,除非使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
2. 定址
可以通过定址来定位你所希望编辑的行,该地址可以用数字构成,用逗号分隔的两个行数表示起始的范围(包括行数表示的那两行)。如1,3表示1,2,3行,$ 表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
3. 调用sed命令有两种形式
sed [options] 'command' filename...
sed [options] -f scriptfile filename...
options:
-i :直接对原文件的内容进行操作,不由屏幕输出结果
-n :静默模式,常与p共同使用 -->;只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
在一般 sed 的用法中,所有来自STDIN 的数据一般都会被列出到屏上 eg:# sed -n '1,3p' test <--> # sed '1,3p' /etc/passwd
-r :使用扩展正则表达式
-f file :将文件中指定的命令添加到处理输入时执行的命令中
-e :可以指定多个编辑命令 -->;允许在同一行里执行多条命令,多条命令之间使用 ;隔开。 命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
eg: # sed -e '1,5d;s/apple/APP/' test
example -->; (-e)选项。第一条命令删除1至5行,第二条命令用APP替换apple
example -->; (-e)选项。第一条命令删除1至5行,第二条命令用APP替换apple
# sed 'ADDR1,ADDR2command' file... -->; eg: # sed '1,5d' test.txt 删除test.txt文件中的第1到5行
# sed '/PATTERN/command' file... -->; eg: # sed '/kill/d' test.txt 删除test.txt文件中所有包含kill的行
# sed '/PATHERN1/,/PATTERN2/command' file... 匹配范围为从第一次找到PATHEERN1的行到第一次找到PATHERN2的行结束
d :删除指定行p :显示,模式空间中的文本在处理之前,每一次都会先显示a \:在模式匹配到的行后面添加新内容i \:在模式匹配到的行前面添加新内容r FILE: 文件读入 eg: $ sed '/test/r file' tmp.txtw FILE: 文件写入 sed -n '[a-z]/w /tmp/test.txt' b.txt.sh 把b.txt文件中所有包含小写字母的行都写入到test.txt中s: s/PATHRN/string/
s/pathen/string/g:
i:不区分大小写
/dev/vol0/root -->;/dev/sda2
s#/dev/vol0/root#dev/sda2
原文件中的内容
删除:d命令
# sed '2d' example --> 删除example文件的第二行。
# sed '2,$d' example --> 删除example文件的第二行到末尾所有行。
# sed '$d' example --> 删除example文件的最后一行。
# sed '/test/'d example --> 删除example文件所有包含test的行。
# sed '1,5!d' example --> 删除 除了第1到2行外的其它行 !号是对其前面的要匹配的范围取反。
替换:s命令
# sed 's/boot/BOOT/g' test -->; 在整行范围内把this替换为mytest。如果没有g标记,则只有每行第一个匹配的boot被替换成BOOT。
# sed -n 's/^this/mytest/p' test.txt -->; (-n)选项和p标志一起使用表示只打印那些发生了改变的行。如果某一行开头的this被替换成mytest,就打印它。
# sed 's/^23409/&localhost/' -->; &符号表示替换换字符串中被找到的部份。所有以23409开头的行都会被替换成它自已加localhost,变成23409localhost。
# sed -n 's/\(DOG\)/\1s/p' -->; DOG被标记为1,所有DOG会被替换成DOGs,而且替换的行会被打印出来。
# sed -n 's#1#ABC#gp' -->; 不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有1替换成ABC。
选定行的范围:逗号
# sed -n '/this/,/xisi/p' test -->; 所有在this和xisi所确定的范围内的行都被打印。
# sed -n '3,/^apple/p' test -->; 打印从第五行开始到第一个包含以apple开始的行之间的所有行。
# sed -n '/this/,/home/s/is/FUCK/gp' test -->; 对于this和home之间的行,每行的is用FUCK替换。
从文件读入:r命令
# sed '/good/r file' test -->;file里的内容被读进来,显示在与good匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
# sed '1r file' test -->; 将file 中的内容加入到test的第一行的下面
# sed '1r file' test -->; 将file 中的内容加入到test的第一行的下面
写入文件:w命令
# sed -n '/boot/w file' test -->; 在test中所有包含boot的行都被写入file里。
追加:a\命令
$ sed '/boot/a\ *****This is a new world ***** ' test 如果boot被匹配,则把反斜杠后面的文本追加匹配的行后面,sed要求命令a后面有一个反斜杠。
插入:i\命令
$ sed '/boot/i\ ***** haha houhou wowowo****' test 如果boot被匹配,则把反斜杠后面的文本插入到匹配行的前面。
变形:y命令
$ sed '1,10y/#/A/' test 把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
转载于:https://blog.51cto.com/xyuex/905653