0
点赞
收藏
分享

微信扫一扫

sed 学习笔记


声明: 这些代码只是为了学习和理解sed命令而为之,并不 代表问题的唯一解或最佳解,希望各位拍砖
参考资 料:<sed&awk.pdf>等
一. 替换

1.神奇变换(y

sed 'y/ori_letter_list/target_letter_list/' filename

cat filename 
1234567890
2345678901
3456789012
4567890123

测试
将 文件中1 换成A
将文件中2 换成B
...
将文件中0 换成J

sed 'y/1234567890/ABCDEFGHIJ/' filename 
ABCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC

注意变换关系是按两个list的位置对应变换,y是一个管局命令,拒绝使用后缀flag/g
list1:1234567890
list2:ABCDEFGHIJ
下 面再作一个与前例相反的变换

sed 'y/0987654321/ABCDEFGHIJ/' filename 
JIHGFEDCBA
IHGFEDCBAJ
HGFEDCBAJI
GFEDCBAJIH

2.替换每行第一个匹配

sed 's/regexpr/anyword/' filename 
sed 's/regexpr/anyword/1' filename

举例:

引用:


sed 's/regexpr/anyword/' filename 
sed 's/regexpr/anyword/1' filename

3.替换每行第n(如果有的 话)个匹配

sed "s/regexpr/anyword/${n}" filename 
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
举 例
sed "s/4/ 四 /8" filename
111111111111111111
222222222222222222
333333333333333333
4444444 四 4444444444

4.替换每行所有匹配

sed "s/regexpr/anyword/${n}" filename 
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
举 例
sed "s/4/ 四 /8" filename
111111111111111111
222222222222222222
333333333333333333
4444444 四 4444444444

sed "s/regexpr/anyword/${n}" filename 
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
举 例
sed "s/4/ 四 /8" filename
111111111111111111
222222222222222222
333333333333333333
4444444 四 4444444444

二.行号处理


sed = filename|sed 'N;s//n/:/' 
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444

举例

sed = filename|sed 'N;s//n/:/' 
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444

2.仅为文件中的正文行加行 号

sed /./= a|sed '/./N;s//n/:/'

举例

cat filename 
111111111111111111

222222222222222222
333333333333333333

444444444444444444

sed /./= a|sed '/./N;s//n/:/' filename
1:111111111111111111

3:222222222222222222
4:333333333333333333

6:444444444444444444

三.字串翻转

sed '//n/!G;s//(./)/(.*/n/)/&/2/1/;//D;s/.//'

举例

echo 1234567890|sed '//n/!G;s//(./)/(.*/n/)/&/2/1/;//D;s/.//' 
0987654321

四.选择性输出

1.打印文档奇数行(隔行输出)

sed 'n;d' 
sed 'x;$!N;x'
sed -n 'p;n'

1
3
5
7

2.打印偶数行(隔行输出)

sed 'n;d' 
sed 'x;$!N;x'
sed -n 'p;n'

1
3
5
7

3.删除连续重复行(大量使 用了pattern space 文件太大时要注意)

sed 'n;d' 
sed 'x;$!N;x'
sed -n 'p;n'

1
3
5
7

举例

sed 'n;d' 
sed 'x;$!N;x'
sed -n 'p;n'

1
3
5
7

4.合并上下行并以空格相分 隔

sed 'n;d' 
sed 'x;$!N;x'
sed -n 'p;n'

1
3
5
7

举例

cat file 
1234567890
0987654321
执行命令后
1234567890 0987654321

5.将以/符号结尾的行与下行合并并以空格分隔(拼接断行)

cat file 
1234567890
0987654321
执行命令后
1234567890 0987654321

举例

代码:

cat filename

1 111111111111111111/

2 222222222222222222

3 333333333333333333/

4 444444444444444444


sed -e :a -e '///$/N; sn/ /; ta' filename

1 111111111111111111 2 222222222222222222

3 333333333333333333 4 444444444444444444

6.按关键字拼接行
如果某行以=开始,则合并到上一行并替代=为空格

代码:

sed -e :a -e '$!N;s//n=/ /;ta' -e 'P;D'

举例

cat file
111111111111111111
222222222222222222
=333333333333333333
444444444444444444

sed -e :a -e '$!N;s//n=/ /;ta' -e 'P;D' filename
111111111111111111
222222222222222222 333333333333333333
444444444444444444
————————————————

7.输出匹配行的下一行

sed -n '/regexpr/{n;p;}' filename

举例

cat filename 
1 111111111111111111
2 222222222222222222
3 333333333333333333
4 444444444444444444

sed -n '/^3/{n;p;}' filename
4 444444444444444444

8.显示匹配行的行号并输出 匹配行的上行、匹配行、下行

sed -n -e '/regexpr/{=;x;1!p;g;$!N;p;D;}' -e h
举例

cat filename 
1 111111111111111111
2 222222222222222222
3 333333333333333333
4 444444444444444444

sed -n -e '/^3/{=;x;1!p;g;$!N;p;D;}' -e h filename
3 #匹配行的行号
2 222222222222222222 #上一行
3 333333333333333333 #匹配行
4 444444444444444444 #下一行

9.删除文档中某标志区域内 的关键字匹配行

删除文档中从being开到end结束的块中包含myword的行

sed '/^begin/,/^end/{/myword/d;}' filename

cat filename 
myword
begin
myword
Number!
myword
Number!
myword
Number!
myword
Number!
end
myword
Number!

测试

引用:

cat filename 
myword
begin
myword
Number!
myword
Number!
myword
Number!
myword
Number!
end
myword
Number!

五.字串解析

1.从字串中解析出两个子串(前2各字符和后9个字符)

cat filename 
myword
begin
myword
Number!
myword
Number!
myword
Number!
myword
Number!
end
myword
Number!

2.分解日期串

echo 20030922|sed 's//(..../)/(../)/(../)//1 /2 /3/'|read year month day 
echo $year $month $day
2003 09 22


举报

相关推荐

0 条评论