Linux sed命令详解
简介
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送到屏幕。接着处理下一行,这样不断重复,知道文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用自动编辑一个或者多个文件;简化对文件的反复操作;编写转换程序等。
sed使用参数
sed [-nefr] [动作]
选项与参数:
-n:使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来,
-e:直接在命令列模式上进行sed的动作编辑;
-f:直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作;
-r:sed的动作支持的是延伸型正则表达式的语法。(默认是基础正则表达式语法)
-i:直接修改读取的文件内容,而不是输出到终端。
动作说明:[n1,n2] function
n1,n2:不见得会存在,一般代表【选择进行动作的行数】,举例来说,如果我的动作是需要在10到20行之间进行的,则【10,,20[动作行为]】
function:
a:新增 a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~
c:取代, c的后面可以接字符串,这些字符串可以取代n1,n2之间的行!
d:删除,因为是删除啊,所以d后面通常不接任何咚咚;
i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p:列印,即将某个选择的数据印出。通常p会参与sed -n一起运行~
s:取代,可以直接进行取代的工作里!通常这个s的动作可以搭配正规表达式法!例如1,20s/old/new/g就是啦!
举例:
一行为单位的新增和删除
①、将/etc/passwd的内容列出来并且列印行号,同时,请将第2~5行删除!
nl /etc/passwd | sed '2,5d'
sed的动作'2,5d',那个d就是删除!因为2~5行给它删除了,所以显示的数据就没有2~5行罗列了,另外,注意一下,原本应该是要下达sed -e才对,没有-e也行了!同时也要注意的是,sed后面接的动作,请务必以''两个单引号括住!
只要删除第2行
nl /etc/passwd | sed '2d'
要删除第3到最后一行
nl /etc/passwd | sed '1,$d'
在第二行(即是加在第三行)加上【drink tea】字样!
nl /etc/passwd | sed '2a drink tea'
那如果是要在第二行前
nl /etc/passwd | sed '2i drink tea'
如果是要增加两行以上,在第二行后面加入两行字,例如
【drink tea or ......】和【drink beer?】
nl /etc/passwd | sed '2a Drink tea or ...... drink beer ?'
每一行之间必须要以反斜杠【】来进行新行的添加!所以,上面的例子中,我们可以发现在第一行的最后面就有\存在。
②、以行为单位的替换和显示
将第2~5行的内容取代成为[No 2-5 number]呢?
nl /etc/passwd | sed '2,5c No 2-5 number'
仅列出/etc/passwd文件内的第5·7行
nl /etc/passwd | sed -n '5,7p'
可以通过这个sed的以行为单位的显示功能,就能将某一个文件内的某些行号选择出来显示。
数据的搜索并显示
搜索/etc/passwd有root关键字的行
nl /etc/passwd | sed 's/root/p'
如果root找到了,除了输出所有行,还会输出匹配行。
使用-n的时候将只打印包含模板的行。
nl /etc/passwd | sed -n '/root/p'
数据的搜索并删除
删除/etc/passwd所有包含root的行,其他行删除
nl /etc/passwd | sed '/root/d'
数据的搜索并替换
除了正行的处理模式之外,sed还可以用行为单位进行部分数据的搜索并取代。基本上sed的搜索和替代和vi相当的类似,语法:
sed 's/要被取代的字符串/新的字符串/g'
多点编辑
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell。
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/g'
直接修改文件内容(危险动作)
sed可以直接修改文件的内容,不必使用管道命令或者数据流重定向,不过,由于这个动作会直接修改原始的文件,所以请你千万不要随便拿系统配置来测试!我们还是使用下载的regular_express.txt文件来测试看看吧!
sed -i 's/.$/!/g' regular_express.txt
利用sed直接regular_express.txt最后一行加入【# This is a test】
sed -i '$a # This is a test' regular_express.txt
由于$代表最后一行,而a的动作是新增,因此该文件最后新增【# This is a test】!
sed的【-i】选项可以直接修改文件内容,这功能非常有帮助!
举例来说,如果你有一个100万行的文件,你要在第100行加某些文字,此时使用vim可能会疯掉的,因为文件太大了,那么怎么办呢?就利用sed啊,通过sed直接修改取代的功能,你甚至不需要使用vim去修订了。
Linux sed命令详解
概述:
sed是stream editor的简称,也就是流编辑器。它一次处理一行内容,处理时, 把当前处理的行存储在临时缓冲区中,称为为“pattern space”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用了重定向存储输出。
语法:
sed [option] 'command' input_file
常用选项
。-n使用安静silent模式。在一般sed的用法中,所有来自stdin的内容一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作才会被列出来)
。 -e直接在指令模式上进行sed的动作编辑。
。 -f直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed命令
。 -r让sed命令支持扩展表达式(默认是基础表达式)
。 -i 直接修改读取的文件内容,而不是由屏幕输出。
常用命令:
。a\:追加行,a\的后面跟上字符串s(多行字符串用\n分割),则会在当前选择的行的后面都加上字符串s。
。c\:提换行,c\后面跟上字符串s(多行字符串可以用\n分割),则会将当前选中的行替换为字符串s。
。i:插入行,i\后面跟上字符串s(多行字符串可以用\n分割),则会在当前选中的行的前面都插入字符串s。
。d:删除行delete,该命令会将当前选中的行删除。
。y:替换字符,通常y命令的用法是这样的:y/Souse-chars/Dest-chars/,分割字符/可以用任意单字符替换,用Dest=chars中对应位置的字符串替换掉Soutce-chars中对应位置的字符。
。p:打印print,该命令会打印当前选择的行到屏幕上
。s:替换字符串,通常s命令的用法是这样的:1,$/Regexp/Replacement/Flags,分隔字符/可以用其他任意字符代替,用Replacement替换掉匹配字符串。
替换选项:
。\digit:Replacement中可含有后向引用中的\digit(digit是1之9),引用前面定义的子表达式
。&:代表模板空间中的整个匹配部分
。\L:将在其后的替换部分转换成小写字母,直到发现一个\U或\E,GNU扩展功能
。\l:将下一个字符转换成小写字母,GNU扩展功能
。\U:将在其后的替换部分转换成大写字母,直到发现一个\L或\E,GNU扩展功能
。\u:将下一个字符转换成大写字母,GNU扩展功能
。\E:停止由\L或\U指示开始的大小写转换,GNU扩展功能
标志选项:
。g:将用Replacement替换模版空间中所有匹配Regexp的部分,则不仅仅是第一个匹配部分
。digit:只用Replacement替换模版空间中第digit(digit是1至9)个匹配Regexp的部分
。p:若发生了替换操作,指示显示模版空间中新的数据
。w file-name:若发生了替换操作,指示将模版空间中新的数据写入指定的文件file-name中
。i:表示进行Regexp匹配时,是不区分大小写字母的
基本正则表达式
基本正则表达式(BRE)元字符表
元字符 说明
* 将*前面的正则表达式匹配的结果重复任意次(含0次)。
\+ 与星号(*)相同,只是至少重复1次,GNU的扩展功能。
\? 与星号(*)相同,只是最多重复1次,GNU的扩展功能。
\{i\} 与星号(*)相同,只是重复指定的i次。
\{i,j\} 与星号(*)相同,只是重复i至j次。
\{i, \} 与星号(*)相同,只是至少重复i次。
\(regexp\) 将regexp看作一个整体,用于后向引用,与\digit配合使用。
. 匹配任意单个字符。
^ 匹配模版空间开始处的NULL字符串。
$ 匹配的是模版空间结束处的NULL字符串。
[list] 匹配方括号中的字符列表中的任意一个。
[^list] 否定匹配方括号中的字符列表中的任意一个。
regexp1\|regexp2 用在相邻的正则表达式之间,表示匹配这些正则表达式中任一个都可以。匹配是从左向右开始的,一旦匹配成功就停止匹配。
regexp1regexp2 匹配regexp1和regexp2的连接结果。
\digit 匹配正则表达式前半部分定义的后向引用的第digit个子表达式。digit为1至9的数字, 1为从左开始。
\n 匹配换行符。
\meta 将元字符meta转换成普通字符,以便匹配该字符本身,有$、 *、 .、 [、 \ 和 ^。
扩展正则表达式
扩展正则表达式除了以下元字符与基本正则表达式不同外,其余相似。
BRE与ERE元字符对应表
基本正则表达式 扩展正则表达式
\? ?
\+ +
\| |
\{ \} { }
\( \) ( )