sed缓冲区
sed 处理文件时,会把文件的每一行保存在一个临时缓冲区,即模式空间。
sed处理完一行后,该模式空间就被清空,下一行等待处理。因此可把模式空间内容用命令h复制并
保存在一个暂存缓冲区(holding buffer)内,然后可用命令G把它从暂存缓冲区读出一行,并放回模式空间缓冲区,
追加在模式空间内当前行的后面。
**sed执行过程:
a. 如果已到达文件尾,goto e;否则,用当前行内容替换模式空间的内容(即缓冲区,还有一个缓冲区:后备空间);
b. 执行命令序列,命令只对模式空间有效;
c. 当前行号加1
d. goto a;
e. 退出
注: 当前行号可由命令N或n更改,当前行号最初为第1行
执行命令时,如果该命令有地址前缀,那么看*当前行号*是否与地址前缀相符,相符则执行,否则不执行
**选项:
-V
--version
提示版本信息
-h
--help
提示帮助信息
-n
--quite
--silent
默认情形,sed在执行完用户提交的命令列表后,会执行p命令,这3个选项能屏蔽这个默认功能
-e
--exception=script
增加script命令列表到当前命令列表
-f
--file=script-file
增加script-file文件内的命令列表到当前命令列表
初始时,当前命令列表为空;如果没有-e,--exception,-f,--file选项,那么命令行的第一个非选项参数被
当作命令列表添加到当前命令列表中
**常见命令:
可带范围地址前缀的命令(11个):
d 删除模式空间的内容,goto c
D 删除模式空间内的第一行,如果模式空间内还有内容,goto b,否则,goto c
p 将模式空间中的内容输出到标准输出
P 将模式空间中的第一行内容输出到标准输出
N 读入下一行,将其*追加*到模式空间尾,当前行号加1,如果没有可读的行了,goto e
n 读入下一行,用它*替换*模式空间内容,当前行好加1,如果没有可读的行了,goto e
h 用模式空间内容*替换*后备空间内容
H 将模式空键内容*追加*到后备空间尾
g/G 同h/H,但方向相反,后备空间->模式空间
x 交换模式空间和后备空间内容
l 输出模式空间内容到标准输出,以更人性话的方式输出
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
c\ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即退出
{ } 在定位行执行的命令组
1. sed -n 'row_number,/pattern/p' FILE_NAME; #如果在该行匹配到pattern就显示该行及以下所有行的,如果没匹配,则显示该行到以下第一个匹配行间所有行
2. sed -n '1,$p' FILE_NAME; #显示第一行到最后一行的所有内容
sed -n '/^$/p' FILE_NAME; #显示空行
3. sed -n '/pattern/=' FILE_NAME; #打印所有行,匹配行打印行数,不打印内容
* sed -e '/pattern/=' FILE_NAME; #打印匹配行打印行数,不打印内容
sed -e '/pattern/=' -n -e '/pattern/p' FILE_NAME; #打印匹配行数及该行的内容,要用2个sed命令,一个显示行号,一个显示内容
sed -n -e '=;p' FILE_NAME; #给所有行加行号
4. sed '/pattern/a\#append_content#' FILE_NAME; #注意#append_content#替换成自己要的内容,并把内容附加在匹配行的下一行,#append_content#中可以用'\'来进行换行
sed '/pattern/i\#append_content#' FILE_NAME; #注意#append_content#替换成自己要的内容,并把内容附加在匹配行的上一行,#append_content#中可以用'\'来进行换行
5. sed '/pattern/c\#replace_content#' FILE_NAME; #将匹配行置换成#replace_content#内容
6. sed '/pattern/d' FILE_NAME; #删除匹配行
7. sed 's/pattern/#replace_word#/' FILE_NAME; #将匹配到的字符串替换成#replace_word#内容,注意和第5点的区别,每行只替换第一个匹配到的
sed 's/pattern/#replace_word#/g' FILE_NAME; #将匹配到的字符串替换成#replace_word#内容,替换所有匹配到的
* sed 's/pattern/#replace_word#/w another_file' FILE_NAME; #将匹配到的内容置换后,输出到another_file(只输出匹配行)
sed -n 's/pattern/#replace_word#/p' FILE_NAME>another_file; #效果同上,如果不加p, 则输出空到another_file
* sed -n 's/pattern/#some_words# &/p' FILE_NAME; #使用替换修改字符串,这里‘&’代表前面匹配到的字符串,然后在该字符串前加#some_words#,当然也可以在其后。。
8. sed '/pattern/r another_file' FILE_NAME; #从another_file中读入内容,把内容加在匹配行的下一行
9. sed '/pattern/q' FILE_NAME; #匹配到第一个即退出,不再匹配后面
注:
1. 删除模式 (/pattern/d)删除匹配字符所在的行,如果要删除匹配到的字符,则要用替换模式(s/pattern//g)
2. 如果要用shell变量,那必须要用双引号
例:rep_word="replace it";
sed "s/#replace_word#/$rep_word/g" FILE_NAME;
3. echo "account"|sed 's/$/&.doc/g' # ‘$’代表传入的值
4. sed中-n和p成对出现时表示显示比配到的行,-e用来指定多个不同的命令,如上面的3.3例
5. 替换模式 s/// 只是一个命令,它没有指定所作用的行(默认是全文本),所以我们可以指定行
sed '1,20s/word1/word2/g' FILE_NAME; #作用范围1~20行
sed '/^$/,/^END/s/word1/word2/g' FILE_NAME; #作用范围,空行到END开头的行
6. s///模式还可以指定分隔符 sed 's:word1:word2:g' FILE_NAME; #现在是以:为分隔符
7. 如果要删除
aabbcc
中的html标签p,我们尝试
sed 's/<.*>//g' FILE_NAME; #这样的效果是删除了整个
aabbcc
,因为sed是匹配最长字符串的,
如果要达到预期效果,我们必须
sed 's/<[^>]*>//g' FILE_NAME; #指定<和>之间是非>的任意多个任意字符
8. 指定区域 sed 's/\(.*\) \(.*\) \(.*\)/word1 \1 word2 \2 word3/' FILE_NAME; #以空格为间隙,把行分为3个部分,每个部分的调用可以用\n来实现