sed个人习惯用法总结

简介:

我这个是根据个人习惯做的笔记,一般常用的我就不记了,记一些爱忘记的!!!

sed -[nerif] '行号,行号 action/str/str/action' file

(/,@,#都是前面所说的地址定界符)

1
2
3
sed  's@@@'  file
sed  's///'  file
sed  's###'  file

这三种方式都行


sed命令的语法格式:

sed的命令格式: sed [option] 'sed command'filename

sed的脚本格式:sed [option] -f 'sed script'filename


sed命令的选项(option):

-n :只打印模式匹配的行

-e :直接在命令行模式上进行sed动作编辑,此为默认选项

-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

-r :支持扩展表达式

-i :直接修改文件内容


在此的/bash/为匹配字段,匹配bash,然后把root改为hello,然后打印出来

1
2
[root@hxy working] # sed -n '/bash/s/root/hello/p'  /etc/passwd
hello:x:0:0:root: /root : /bin/bash



提取IP的命令

1
ifconfig | grep  -B1  "inet addr"  | grep  - v  "\-\-"  | sed  -n -e  'N;s/\(eth[0-9]\).*\n.*addr:\(.*\)/\1 \2/p' | awk  '{print $1,$2}'

解释下,我之前都不知道\1 \2是怎么来的,在网上查了老半天才明白;

在sed中 sed 's/\(str1\)str\(str2\)/\1 \2/p' 这里的str1就代表了\1 str2就代表了\2

这样的域是用括号括起来的,后面才能知道的


sed变量替换变量

1
2
3
4
eval  sed  's/$a/$b/'  filename
sed  "s/$a/$b/"  filename
sed  's/' $a '/' $b '/'  filename
sed  s/$a/$b/ filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#正常的用单引号也是无效的
[root@hxy working] # echo "hello world"|sed 's/$a/$b/'
hello world
root@hxy working] # echo "hello world"|eval sed 's/$a/$b/'
nihao world
#如果是加在前面就是无效的
[root@hxy working] # eval echo "hello world"|sed 's/$a/$b/'
hello world
[root@hxy working] # echo "hello world"|sed "s/$a/$b/"
nihao world
[root@hxy working] # echo "hello world"|sed 's/'$a'/'$b'/'
nihao world
[root@hxy working] # echo "hello world"|sed s/$a/$b/
nihao world

一个有关sed的一个面试题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
##1)、处理以下文件内容,将域名取出并进行计数排序,如处理:  
http: //www .baidu.com /index .<a target= "_blank"  href= "http://www.2cto.com/kf/qianduan/css/"  class= "keylink"  style= "border:none; padding:0px; margin:0px; color:rgb(51,51,51); text-decoration:none; font-size:14px" >html< /a >  
http: //www .baidu.com /1 .html  
http: //post .baidu.com /index .html  
http: //mp3 .baidu.com /index .html  
http: //www .baidu.com /3 .html  
http: //post .baidu.com /2 .html  
得到如下结果:  
域名的出现的次数 域名  
3 www.baidu.com  
2 post.baidu.com  
1 mp3.baidu.com  
[root@hxy working] # cat file | sed -e ' s/http:\/\///' -e ' s/\/.*//' | sort | uniq -c | sort -rn  
3 www.baidu.com  
2 post.baidu.com  
1 mp3.baidu.com  
[root@hxy working] # awk -F/ '{print $3}' file |sort -r|uniq -c|awk '{print $1"\t",$2}'  
3 www.baidu.com  
2 post.baidu.com  
1 mp3.baidu.com


sed的用法很多,我在网上copy了一篇文章虽然感觉用到的很少,但是留着可能会用到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
ed(文件)命令的一些用法
  
文本间隔:
--------
  # 在每一行后面增加一空行
  sed  G
  # 将原来的所有空行删除并在每一行后面增加一空行。
  # 这样在输出的文本中每一行后面将有且只有一空行。
  sed  '/^$/d;G'
  # 在每一行后面增加两行空行
  sed  'G;G'
  # 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
  sed  'n;d'
  # 在匹配式样“regex”的行之前插入一空行
  sed  '/regex/{x;p;x;}'
  # 在匹配式样“regex”的行之后插入一空行
  sed  '/regex/G'
  # 在匹配式样“regex”的行之前和之后各插入一空行
  sed  '/regex/{x;p;x;G;}'
编号:
--------
  # 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符”
  # (tab,见本文末尾关于'\t'的用法的描述)而不是空格来对齐边缘。
  sed  = filename |  sed  'N;s/\n/\t/'
  # 对文件中的所有行编号(行号在左,文字右端对齐)。
  sed  = filename |  sed  'N; s/^/     /; s/ *\(.\{6,\}\)\n/\1  /'
  # 对文件中的所有行编号,但只显示非空白行的行号。
  sed  '/./='  filename |  sed  '/./N; s/\n/ /'
  # 计算行数 (模拟 "wc -l")
  sed  -n  '$='
文本转换和替代:
--------
  # Unix环境:转换DOS的新行符(CR/LF)为Unix格式。
  sed  's/.$//'                      # 假设所有行以CR/LF结束
  sed  's/^M$//'                     # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V
  sed  's/\x0D$//'                   # ssed、gsed 3.02.80,及更高版本
  # Unix环境:转换Unix的新行符(LF)为DOS格式。
  sed  "s/$/`echo -e \\\r`/"         # 在ksh下所使用的命令
  sed  's/$' "/`echo \\\r`/"          # 在bash下所使用的命令
  sed  "s/$/`echo \\\r`/"            # 在zsh下所使用的命令
  sed  's/$/\r/'                     # gsed 3.02.80 及更高版本
  # DOS环境:转换Unix新行符(LF)为DOS格式。
  sed  "s/$//"                       # 方法 1
  sed  -n p                          # 方法 2
  # DOS环境:转换DOS新行符(CR/LF)为Unix格式。
  # 下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的
  #  sed可以通过其特有的“--text”选项。你可以使用帮助选项(“--help”)看
  # 其中有无一个“--text”项以此来判断所使用的是否是UnxUtils版本。其它DOS
  # 版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。
  sed  "s/\r//"  infile >outfile      # UnxUtils sed v4.0.7 或更高版本
  tr  -d \r <infile >outfile         # GNU tr 1.22 或更高版本
  # 将每一行前导的“空白字符”(空格,制表符)删除
  # 使之左对齐
  sed  's/^[ \t]*//'                 # 见本文末尾关于'\t'用法的描述
  # 将每一行拖尾的“空白字符”(空格,制表符)删除
  sed  's/[ \t]*$//'                 # 见本文末尾关于'\t'用法的描述
  # 将每一行中的前导和拖尾的空白字符删除
  sed  's/^[ \t]*//;s/[ \t]*$//'
  # 在每一行开头处插入5个空格(使全文向右移动5个字符的位置)
  sed  's/^/     /'
  # 以79个字符为宽度,将所有文本右对齐
  sed  -e :a -e  's/^.\{1,78\}$/ &/;ta'   # 78个字符外加最后的一个空格
  # 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前
  # 头和后头都填充了空格。 在方法2中,在居中文本的过程中只在文本的前面填充
  # 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。
  sed   -e :a -e  's/^.\{1,77\}$/ & /;ta'                      # 方法1
  sed   -e :a -e  's/^.\{1,77\}$/ &/;ta'  -e  's/\( *\)\1/\1/'   # 方法2
  # 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar”
  sed  's/foo/bar/'                  # 只替换每一行中的第一个“foo”字串
  sed  's/foo/bar/4'                 # 只替换每一行中的第四个“foo”字串
  sed  's/foo/bar/g'                 # 将每一行中的所有“foo”都换成“bar”
  sed  's/\(.*\)foo\(.*foo\)/\1bar\2/'  # 替换倒数第二个“foo”
  sed  's/\(.*\)foo/\1bar/'             # 替换最后一个“foo”
  # 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
  sed  '/baz/s/foo/bar/g'
  # 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换
  sed  '/baz/!s/foo/bar/g'
  # 不管是“scarlet”“ruby”还是“puce”,一律换成“red”
  sed  's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'   #对多数的sed都有效
  gsed  's/scarlet\|ruby\|puce/red/g'                # 只对GNU sed有效
  # 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。
  # 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除
  sed  '1!G;h;$!d'                # 方法1
  sed  -n  '1!G;h;$p'              # 方法2
  # 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”)
  sed  '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
  # 将每两行连接成一行(类似“paste”)
  sed  '$!N;s/\n/ /'
  # 如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾
  # 并去掉原来行尾的反斜杠
  sed  -e :a -e  '/\\$/N; s/\\\n//; ta'
  # 如果当前行以等号开头,将当前行并到上一行末尾
  # 并以单个空格代替原来行头的“=”
  sed  -e :a -e  '$!N;s/\n=/ /;ta'  -e  'P;D'
  # 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567”
  gsed  ':a;s/\B[0-9]\{3\}\>/,&/;ta'                      # GNU sed
  sed  -e :a -e  's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'   # 其他sed
  # 为带有小数点和负号的数值增加逗号分隔符(GNU sed)
  gsed -r  ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'
  # 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)
  gsed  '0~5G'                       # 只对GNU sed有效
  sed  'n;n;n;n;G;'                  # 其他sed
选择性地显示特定行:
--------
  # 显示文件中的前10行 (模拟“head”的行为)
  sed  10q
  # 显示文件中的第一行 (模拟“head -1”命令)
  sed  q
  # 显示文件中的最后10行 (模拟“tail”)
  sed  -e :a -e  '$q;N;11,$D;ba'
  # 显示文件中的最后2行(模拟“tail -2”命令)
  sed  '$!N;$!D'
  # 显示文件中的最后一行(模拟“tail -1”)
  sed  '$!d'                         # 方法1
  sed  -n  '$p'                       # 方法2
  # 显示文件中的倒数第二行
  sed  -e  '$!{h;d;}'  -e x               # 当文件中只有一行时,输入空行
  sed  -e  '1{$q;}'  -e  '$!{h;d;}'  -e x   # 当文件中只有一行时,显示该行
  sed  -e  '1{$d;}'  -e  '$!{h;d;}'  -e x   # 当文件中只有一行时,不输出
  # 只显示匹配正则表达式的行(模拟“grep”)
  sed  -n  '/regexp/p'                # 方法1
  sed  '/regexp/!d'                  # 方法2
  # 只显示“不”匹配正则表达式的行(模拟“grep -v”)
  sed  -n  '/regexp/!p'               # 方法1,与前面的命令相对应
  sed  '/regexp/d'                   # 方法2,类似的语法
  # 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行
  sed  -n  '/regexp/{g;1!p;};h'
  # 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行
  sed  -n  '/regexp/{n;p;}'
  # 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所
  # 在行的行号 (类似“grep -A1 -B1”)
  sed  -n -e  '/regexp/{=;x;1!p;g;$!N;p;D;}'  -e h
  # 显示包含“AAA”、“BBB”或“CCC”的行(任意次序)
  sed  '/AAA/!d; /BBB/!d; /CCC/!d'   # 字串的次序不影响结果
  # 显示包含“AAA”、“BBB”和“CCC”的行(固定次序)
  sed  '/AAA.*BBB.*CCC/!d'
  # 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”)
  sed  -e  '/AAA/b'  -e  '/BBB/b'  -e  '/CCC/b'  -e d     # 多数sed
  gsed  '/AAA\|BBB\|CCC/!d'                         # 对GNU sed有效
  # 显示包含“AAA”的段落 (段落间以空行分隔)
  # HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样
  sed  -e  '/./{H;$!d;}'  -e  'x;/AAA/!d;'
  # 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
  sed  -e  '/./{H;$!d;}'  -e  'x;/AAA/!d;/BBB/!d;/CCC/!d'
  # 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序)
  sed  -e  '/./{H;$!d;}'  -e  'x;/AAA/b'  -e  '/BBB/b'  -e  '/CCC/b'  -e d
  gsed  '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'          # 只对GNU sed有效
  # 显示包含65个或以上字符的行
  sed  -n  '/^.\{65\}/p'
  # 显示包含65个以下字符的行
  sed  -n  '/^.\{65\}/!p'             # 方法1,与上面的脚本相对应
  sed  '/^.\{65\}/d'                 # 方法2,更简便一点的方法
  # 显示部分文本——从包含正则表达式的行开始到最后一行结束
  sed  -n  '/regexp/,$p'
  # 显示部分文本——指定行号范围(从第8至第12行,含8和12行)
  sed  -n  '8,12p'                    # 方法1
  sed  '8,12!d'                      # 方法2
  # 显示第52行
  sed  -n  '52p'                      # 方法1
  sed  '52!d'                        # 方法2
  sed  '52q;d'                       # 方法3, 处理大文件时更有效率
  # 从第3行开始,每7行显示一次   
  gsed -n  '3~7p'                    # 只对GNU sed有效
  sed  -n  '3,${p;n;n;n;n;n;n;}'      # 其他sed
  # 显示两个正则表达式之间的文本(包含)
  sed  -n  '/Iowa/,/Montana/p'        # 区分大小写方式
选择性地删除特定行:
--------
  # 显示通篇文档,除了两个正则表达式之间的内容
  sed  '/Iowa/,/Montana/d'
  # 删除文件中相邻的重复行(模拟“uniq”)
  # 只保留重复行中的第一行,其他行删除
  sed  '$!N; /^\(.*\)\n\1$/!P; D'
  # 删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存
  # 大小,或者使用GNU sed。
  sed  -n  'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
  # 删除除重复行外的所有行(模拟“uniq -d”)
  sed  '$!N; s/^\(.*\)\n\1$/\1/; t; D'
  # 删除文件中开头的10行
  sed  '1,10d'
  # 删除文件中的最后一行
  sed  '$d'
  # 删除文件中的最后两行
  sed  'N;$!P;$!D;$d'
  # 删除文件中的最后10行
  sed  -e :a -e  '$d;N;2,10ba'  -e  'P;D'    # 方法1
  sed  -n -e :a -e  '1,10!{P;N;D;};N;ba'   # 方法2
  # 删除8的倍数行
  gsed  '0~8d'                            # 只对GNU sed有效
  sed  'n;n;n;n;n;n;n;d;'                 # 其他sed
  # 删除匹配式样的行
  sed  '/pattern/d'                       # 删除含pattern的行。当然pattern
                                        # 可以换成任何有效的正则表达式
  # 删除文件中的所有空行(与“grep '.' ”效果相同)
  sed  '/^$/d'                            # 方法1
  sed  '/./!d'                            # 方法2
  # 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。
  # (模拟“cat -s”)
  sed  '/./,/^$/!d'         #方法1,删除文件顶部的空行,允许尾部保留一空行
  sed  '/^$/N;/\n$/D'       #方法2,允许顶部保留一空行,尾部不留空行
  # 只保留多个相邻空行的前两行。
  sed  '/^$/N;/\n$/N;//D'
  # 删除文件顶部的所有空行
  sed  '/./,$!d'
  # 删除文件尾部的所有空行
  sed  -e :a -e  '/^\n*$/{$d;N;ba'  -e  '}'   # 对所有sed有效
  sed  -e :a -e  '/^\n*$/N;/\n$/ba'         # 同上,但只对 gsed 3.02.*有效
  # 删除每个段落的最后一行
  sed  -n  '/^$/{p;h;};/./{x;/./p;}'
特殊应用:
--------
  # 移除手册页(man page)中的nroff标记。在Unix System V或bash shell下使
  # 用'echo'命令时可能需要加上 -e 选项。
  sed  "s/.`echo \\\b`//g"     # 外层的双括号是必须的(Unix环境)
  sed  's/.^H//g'              # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H
  sed  's/.\x08//g'            # sed 1.5,GNU sed,ssed所使用的十六进制的表示方法
  # 提取新闻组或 e-mail 的邮件头
  sed  '/^$/q'                 # 删除第一行空行后的所有内容
  # 提取新闻组或 e-mail 的正文部分
  sed  '1,/^$/d'               # 删除第一行空行之前的所有内容
  # 从邮件头提取“Subject”(标题栏字段),并移除开头的“Subject:”字样
  sed  '/^Subject: */!d; s///;q'
  # 从邮件头获得回复地址
  sed  '/^Reply-To:/q; /^From:/h; /./d;g;q'
  # 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮
  # 地址的部分剃除。(见上一脚本)
  sed  's/ *(.*)//; s/>.*//; s/.*[:<] *//'
  # 在每一行开头加上一个尖括号和空格(引用信息)
  sed  's/^/> /'
  # 将每一行开头处的尖括号和空格删除(解除引用)
  sed  's/^> //'
  # 移除大部分的HTML标签(包括跨行标签)
  sed  -e :a -e  's/<[^>]*>//g;/</N;//ba'


本文转自  Forande  51CTO博客,原文链接:http://blog.51cto.com/853056088/1934635
相关文章
|
2月前
|
Unix Windows Perl
sed具体的介绍
sed具体的介绍
14 2
|
5月前
|
Perl
Sed使用总结
Sed使用总结
21 0
|
人工智能 移动开发 Unix
三剑客之 sed
三剑客之 sed
|
移动开发 开发工具 Perl
|
JavaScript Java Shell
|
JavaScript Java Shell
|
Shell Perl Linux