SED教程

用s命令替换

我使用下面的这段文本做演示:

1
2
3
4
5
6
7
8
9
$ cat pets.txt
This is my cat
   my cat 's name is betty
This is my dog
   my dog's name is frank
This is my fish
   my fish's name is george
This is my goat
   my goat's name is adam

把其中的my字符串替换成Hao Chen’s,下面的语句应该很好理解(s表示替换命令,/my/表示匹配my,/Hao Chen’s/表示把匹配替换成Hao Chen’s,/g 表示一行上的替换所有的匹配):

1
2
3
4
5
6
7
8
9
$ sed "s/my/Hao Chen's/g" pets.txt
This is Hao Chen's cat
   Hao Chen 's cat' s name is betty
This is Hao Chen's dog
   Hao Chen 's dog' s name is frank
This is Hao Chen's fish
   Hao Chen 's fish' s name is george
This is Hao Chen's goat
   Hao Chen 's goat' s name is adam

注意:如果你要使用单引号,那么你没办法通过\’这样来转义,就有双引号就可以了,在双引号内可以用\”来转义。

再注意:上面的sed并没有对文件的内容改变,只是把处理过后的内容输出,如果你要写回文件,你可以使用重定向,如:

1
$ sed "s/my/Hao Chen's/g" pets.txt > hao_pets.txt

或使用 -i 参数直接修改文件内容:

1
$ sed -i "s/my/Hao Chen's/g" pets.txt

在每一行最前面加点东西:

1
2
3
4
5
6
7
8
9
$ sed 's/^/#/g' pets.txt
#This is my cat
#  my cat's name is betty
#This is my dog
#  my dog's name is frank
#This is my fish
#  my fish's name is george
#This is my goat
#  my goat's name is adam

在每一行最后面加点东西:

1
2
3
4
5
6
7
8
9
$ sed 's/$/ --- /g' pets.txt
This is my cat ---
   my cat 's name is betty ---
This is my dog ---
   my dog's name is frank ---
This is my fish ---
   my fish's name is george ---
This is my goat ---
   my goat's name is adam ---

顺手介绍一下正则表达式的一些最基本的东西:

  • ^ 表示一行的开头。如:/^#/ 以#开头的匹配。
  • $ 表示一行的结尾。如:/}$/ 以}结尾的匹配。
  • \< 表示词首。 如 \<abc 表示以 abc 为首的詞。
  • \> 表示词尾。 如 abc\> 表示以 abc 結尾的詞。
  • . 表示任何单个字符。
  • * 表示某个字符出现了0次或多次。
  • [ ] 字符集合。 如:[abc]表示匹配a或b或c,还有[a-zA-Z]表示匹配所有的26个字符。如果其中有^表示反,如[^a]表示非a的字符

正规则表达式是一些很牛的事,比如我们要去掉某html中的tags:

html.txt
1
< b >This</ b > is what < span style = "text-decoration: underline;" >I</ span > meant. Understand?

看看我们的sed命令

1
2
3
4
5
6
7
8
# 如果你这样搞的话,就会有问题
$ sed 's/<.*>//g' html.txt
  Understand?
 
# 要解决上面的那个问题,就得像下面这样。
# 其中的'[^>]' 指定了除了>的字符重复0次或多次。
$ sed 's/<[^>]*>//g' html.txt
This is what I meant. Understand?

我们再来看看指定需要替换的内容:

1
2
3
4
5
6
7
8
9
$ sed "3s/my/your/g" pets.txt
This is my cat
   my cat 's name is betty
This is your dog
   my dog's name is frank
This is my fish
   my fish's name is george
This is my goat
   my goat's name is adam

下面的命令只替换第3到第6行的文本。

1
2
3
4
5
6
7
8
9
$ sed "3,6s/my/your/g" pets.txt
This is my cat
   my cat 's name is betty
This is your dog
   your dog's name is frank
This is your fish
   your fish's name is george
This is my goat
   my goat's name is adam

 

1
2
3
4
5
$ cat my.txt
This is my cat , my cat 's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam

只替换每一行的第一个s:

1
2
3
4
5
$ sed 's/s/S/1' my.txt
ThiS is my cat , my cat 's name is betty
ThiS is my dog, my dog's name is frank
ThiS is my fish, my fish's name is george
ThiS is my goat, my goat's name is adam

只替换每一行的第二个s:

1
2
3
4
5
$ sed 's/s/S/2' my.txt
This iS my cat , my cat 's name is betty
This iS my dog, my dog's name is frank
This iS my fish, my fish's name is george
This iS my goat, my goat's name is adam

只替换第一行的第3个以后的s:

1
2
3
4
5
$ sed 's/s/S/3g' my.txt
This is my cat , my cat 'S name iS betty
This is my dog, my dog'S name iS frank
This is my fiSh, my fiSh'S name iS george
This is my goat, my goat'S name iS adam
多个匹配

如果我们需要一次替换多个模式,可参看下面的示例:(第一个模式把第一行到第三行的my替换成your,第二个则把第3行以后的This替换成了That)

1
2
3
4
5
$ sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt
This is your cat , your cat 's name is betty
This is your dog, your dog's name is frank
That is your fish, your fish's name is george
That is my goat, my goat's name is adam

上面的命令等价于:(注:下面使用的是sed的-e命令行参数)

1
sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt

我们可以使用&来当做被匹配的变量,然后可以在基本左右加点东西。如下所示:

1
2
3
4
5
$ sed 's/my/[&]/g' my.txt
This is [my] cat , [my] cat 's name is betty
This is [my] dog, [my] dog's name is frank
This is [my] fish, [my] fish's name is george
This is [my] goat, [my] goat's name is adam
圆括号匹配

使用圆括号匹配的示例:(圆括号括起来的正则表达式所匹配的字符串会可以当成变量来使用,sed中使用的是\1,\2…)

1
2
3
4
5
$ sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' my.txt
cat :betty
dog:frank
fish:george
goat:adam

上面这个例子中的正则表达式有点复杂,解开如下(去掉转义字符):

正则为:This is my ([^,]*),.*is (.*)
匹配为:This is my (cat),……….is (betty)

然后:\1就是cat,\2就是betty

sed的命令

让我们回到最一开始的例子pets.txt,让我们来看几个命令:

N命令

先来看N命令 —— 把下一行的内容纳入当成缓冲区做匹配。

下面的的示例会把原文本中的偶数行纳入奇数行匹配,而s只匹配并替换一次,所以,就成了下面的结果:

1
2
3
4
5
6
7
8
9
$ sed 'N;s/my/your/' pets.txt
This is your cat
   my cat 's name is betty
This is your dog
   my dog's name is frank
This is your fish
   my fish's name is george
This is your goat
   my goat's name is adam

也就是说,原来的文件成了:

1
2
3
4
This is my cat \n  my cat 's name is betty
This is my dog\n  my dog's name is frank
This is my fish\n  my fish's name is george
This is my goat\n  my goat's name is adam

这样一来,下面的例子你就明白了,

1
2
3
4
5
$ sed 'N;s/\n/,/' pets.txt
This is my cat ,  my cat 's name is betty
This is my dog,  my dog's name is frank
This is my fish,  my fish's name is george
This is my goat,  my goat's name is adam
a命令和i命令

a命令就是append, i命令就是insert,它们是用来添加行的。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 其中的1i表明,其要在第1行前插入一行(insert)
$ sed "1 i This is my monkey, my monkey's name is wukong" my.txt
This is my monkey, my monkey's name is wukong
This is my cat , my cat 's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
 
# 其中的1a表明,其要在最后一行后追加一行(append)
$ sed "$ a This is my monkey, my monkey's name is wukong" my.txt
This is my cat , my cat 's name is betty
This is my monkey, my monkey's name is wukong
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam

我们可以运用匹配来添加文本:

1
2
3
4
5
6
7
# 注意其中的/fish/a,这意思是匹配到/fish/后就追加一行
$ sed "/fish/a This is my monkey, my monkey's name is wukong" my.txt
This is my cat , my cat 's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my monkey, my monkey's name is wukong
This is my goat, my goat's name is adam

下面这个例子是对每一行都挺插入:

1
2
3
4
5
6
7
8
9
$ sed "/my/a ----" my.txt
This is my cat , my cat 's name is betty
----
This is my dog, my dog's name is frank
----
This is my fish, my fish's name is george
----
This is my goat, my goat's name is adam
----
c命令

c 命令是替换匹配行

1
2
3
4
5
6
7
8
9
10
11
$ sed "2 c This is my monkey, my monkey's name is wukong" my.txt
This is my cat , my cat 's name is betty
This is my monkey, my monkey's name is wukong
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
 
$ sed "/fish/c This is my monkey, my monkey's name is wukong" my.txt
This is my cat , my cat 's name is betty
This is my dog, my dog's name is frank
This is my monkey, my monkey's name is wukong
This is my goat, my goat's name is adam
d命令

删除匹配行

1
2
3
4
5
6
7
8
9
10
11
12
$ sed '/fish/d' my.txt
This is my cat , my cat 's name is betty
This is my dog, my dog's name is frank
This is my goat, my goat's name is adam
 
$ sed '2d' my.txt
This is my cat , my cat 's name is betty
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
 
$ sed '2,$d' my.txt
This is my cat , my cat 's name is betty
p命令

打印命令

你可以把这个命令当成grep式的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 匹配fish并输出,可以看到fish的那一行被打了两遍,
# 这是因为sed处理时会把处理的信息输出
$ sed '/fish/p' my.txt
This is my cat , my cat 's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my fish, my fish's name is george
This is my goat, my goat's name is adam
 
# 使用n参数就好了
$ sed -n '/fish/p' my.txt
This is my fish, my fish's name is george
 
# 从一个模式到另一个模式
$ sed -n '/dog/,/fish/p' my.txt
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
 
#从第一行打印到匹配fish成功的那一行
$ sed -n '1,/fish/p' my.txt
This is my cat , my cat 's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
几个知识点

好了,下面我们要介绍四个sed的基本知识点:

Pattern Space

第零个是关于-n参数的,大家也许没看懂,没关系,我们来看一下sed处理文本的伪代码,并了解一下Pattern Space的概念:

1
2
3
4
5
6
7
8
9
10
11
12
foreach line in file {
     //放入把行Pattern_Space
     Pattern_Space <= line;
 
     // 对每个pattern space执行sed命令
     Pattern_Space <= EXEC(sed_cmd, Pattern_Space);
 
     // 如果没有指定 -n 则输出处理后的Pattern_Space
     if (sed option hasn't "-n" )  {
        print Pattern_Space
     }
}
Address

第一个是关于address,几乎上述所有的命令都是这样的(注:其中的!表示匹配成功后是否执行命令)

[address[,address]][!]{cmd}

address可以是一个数字,也可以是一个模式,你可以通过逗号要分隔两个address 表示两个address的区间,参执行命令cmd,伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool bexec = false
foreach line in file {
     if ( match(address1) ){
         bexec = true ;
     }
 
     if ( bexec == true ) {
         EXEC(sed_cmd);
     }
 
     if ( match (address2) ) {
         bexec = false ;
     }
}

关于address可以使用相对位置,如:

1
2
3
4
5
6
7
8
9
10
# 其中的+3表示后面连续3行
$ sed '/dog/,+3s/^/# /g' pets.txt
This is my cat
   my cat 's name is betty
# This is my dog
#   my dog's name is frank
# This is my fish
#   my fish's name is george
This is my goat
   my goat's name is adam
命令打包

第二个是cmd可以是多个,它们可以用分号分开,可以用大括号括起来作为嵌套命令。下面是几个例子:

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
$ cat pets.txt
This is my cat
   my cat 's name is betty
This is my dog
   my dog's name is frank
This is my fish
   my fish's name is george
This is my goat
   my goat's name is adam
 
# 对3行到第6行,执行命令/This/d
$ sed '3,6 {/This/d}' pets.txt
This is my cat
   my cat 's name is betty
   my dog's name is frank
   my fish's name is george
This is my goat
   my goat's name is adam
 
# 对3行到第6行,匹配/This/成功后,再匹配/fish/,成功后执行d命令
$ sed '3,6 {/This/{/fish/d}}' pets.txt
This is my cat
   my cat 's name is betty
This is my dog
   my dog's name is frank
   my fish's name is george
This is my goat
   my goat's name is adam
 
# 从第一行到最后一行,如果匹配到This,则删除之;如果前面有空格,则去除空格
$ sed '1,${/This/d;s/^ *//g}' pets.txt
my cat 's name is betty
my dog's name is frank
my fish's name is george
my goat's name is adam
Hold Space

第三个我们再来看一下 Hold Space

接下来,我们需要了解一下Hold Space的概念,我们先来看四个命令:

g: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
G: 将hold space中的内容append到pattern space\n后
h: 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
H: 将pattern space中的内容append到hold space\n后
x: 交换pattern space和hold space的内容

这些命令有什么用?我们来看两个示例吧,用到的示例文件是:

1
2
3
4
$ cat t.txt
one
two
three

第一个示例:

1
2
3
4
5
6
7
8
9
$ sed 'H;g' t.txt
one
 
one
two
 
one
two
three

是不是有点没看懂,我作个图你就看懂了。

第二个示例,反序了一个文件的行:

1
2
3
4
$ sed '1!G;h;$!d' t.txt
three
two
one

其中的 ‘1!G;h;$!d’ 可拆解为三个命令

  • 1!G —— 只有第一行不执行G命令,将hold space中的内容append回到pattern space
  • h —— 第一行都执行h命令,将pattern space中的内容拷贝到hold space中
  • $!d —— 除了最后一行不执行d命令,其它行都执行d命令,删除当前行

这个执行序列很难理解,做个图如下大家就明白了:

就先说这么多吧,希望对大家有用。


1. Sed简介   
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。   
2. 定址   
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。   
  
3. Sed命令   
调用sed命令有两种形式:   
  
sed [options] 'command' file(s)   
  
sed [options] -f scriptfile file(s)  

 

 


a\   
在当前行后面加入一行文本。
    
b lable   
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。   
c\   
用新的文本改变本行的文本。   
  
从模板块(Pattern space)位置删除行。   

  
删除模板块的第一行。   
i\   
在当前行上面插入文本。   
  
拷贝模板块的内容到内存中的缓冲区。   
  
追加模板块的内容到内存中的缓冲区   
  
获得内存缓冲区的内容,并替代当前模板块中的文本。   
  
获得内存缓冲区的内容,并追加到当前模板块文本的后面。   
  
列表不能打印字符的清单。   
  
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
    
  
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。   
  
打印模板块的行。   

P(大写)   
打印模板块的第一行。   
  
退出Sed。   
r file   
从file中读行。   
t label   
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。   
T label   
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。   
w file   
写并追加模板块到file末尾。   

W file   
写并追加模板块的第一行到file末尾。   
  
表示后面的命令对所有没有被选定的行发生作用。   
s/re/string   
用string替换正则表达式re。   
  
打印当前行号码。   

  
把注释扩展到下一个换行符以前。   
以下的是替换标记   
  
g表示行内全面替换。   
  
p表示打印行。   
  
w表示把行写入一个文件。   
  
x表示互换模板块中的文本和缓冲区中的文本。   
  
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)   
  
4. 选项   
-e command, --expression=command   
允许多台编辑。   
-h, --help   
打印帮助,并显示bug列表的地址。   
-n, --quiet, --silent   
  
取消默认输出。   
-f, --filer=script-file   
引导sed脚本文件名。   
-V, --version   
打印版本和版权信息。   
  
5. 元字符集^   
锚定行的开始 如:/^sed/匹配所有以sed开头的行。    
  
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。    
  
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。    
  
匹配零或多个字符 如:,love这成**love**。    
\<   
锚定单词的开始,如:/\<love/匹配包含以love开头的单词的行。    
\>   
锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。    
x\{m\}   
重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。    
x\{m,\}   
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。    
x\{m,n\}   
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。

 

 

   
----------------6. 实例   
删除:d命令   
  
$ sed '2d' example-----删除example文件的第二行。   
  
$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。   
  
$ sed '$d' example-----删除example文件的最后一行。   
  
$ sed '/test/'d example-----删除example文件所有包含test的行。   
替换:s命令   
  
$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。   
  
$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。   
  
$ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。   
  
$ sed -n 's/ love able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。   
  
$ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。   
选定行的范围:逗号   
  
$ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。   
  
$ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。   
  
$ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。   
多点编辑:e命令   
  
$ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。   
  
$ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。   
从文件读入:r命令   
  
$ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。   
写入文件:w命令   
  
$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。   
追加命令:a命令   
  
$ sed '/^test/a\\--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。   
插入:i命令   
$ sed '/test/i\\   
new line   
-------------------------' example   
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。   
下一个:n命令   
  
$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。   
变形:y命令   
  
$ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。   
退出:q命令   
  
$ sed '10q' example-----打印完第10行后,退出sed。   
保持和获取:h命令和G命令   
  
$ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。   
保持和互换:h命令和x命令   
  
$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。   
7. 脚本   
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

 

 

 

 

 

 

 

 

 

================

丽水和
1175281031
767074
zfjsdc
1302399633
602844
it1192640
1198363590
410973
.....

要这样效果:
丽水和:1175281031:767074
zfjsdc:1302399633:602844
it1192640:1198363590:410973
....
============>>>sed 'N;N;s/\n/:/g' disk

 

 

 

 

1、删除行首空格
   sed 's/^[ ]*//g' filename
   sed 's/^ *//g' filename
   sed 's/^[[:space:]]*//g' filename

2、行后和行前添加新行
   行后:sed 's/pattern/&\n/g' filename
   行前:sed 's/pattern/\n&/g' filename
   &代表pattern

3、使用变量替换(使用双引号)
    sed -e "s/$var1/$var2/g" filename

4、在第一行前插入文本
    sed -i '1 i\插入字符串' filename

5、在最后一行插入
    sed -i '$ a\插入字符串' filename

6、在匹配行前插入
    sed -i '/pattern/ i "插入字符串"' filename

7、在匹配行后插入
   sed -i '/pattern/ a "插入字符串"' filename

8、删除文本中空行和空格组成的行以及#号注释的行
   grep -v ^# filename | sed /^[[:space:]]*$/d | sed /^$/d

 

 

 

删除配置文件中#号注释行
sed 's#\#.*##' file.conf > file.new.conf



删除配置文件中//号注释行
sed 's#//.*##' file.conf > file.new.conf



删除无内容空行
sed '/^$/d' file.conf > file.new.conf



删除由空格和Tab而成的空行
sed '/^[[:space:]]*$/d' file.conf > file.new.conf

 

 

sed -n "3"p file 取第3行

sed -n "1,3"p file 取第1到3行

sed -n "1,$"p file 取第1到最后一行

sed -n "1,$num"p file 取第1到num行

sed -n "\$p" file 取最后1行

sed -e '1!G;h;$!d' file倒过来显示

4.        sed 附加/替换:

sed "/xmdh/a\daoyou" file 把含有xmdh的行的结尾附加daoyou(有换行)

sed 's/$/ daoyou/' file把每行的结尾附加daoyou(在同一行)

sed '/test/s/$/ daoyou/' file把包含test行的结尾附加daoyou(在同一行)

sed '10s/$/ daoyou/' file把第10行的结尾附加daoyou(在同一行)

sed "s/xmdh/daoyou/g" file把xmdh替换成daoyou

sed  "s/xmdh/daoyou/;G"  file把xmdh替换成daoyou并增加一个换行

cat userlog |sed -n '/xmdh/ w test.txt'查看含有xmdh并写入test.txt中

 

 

 

 

显示行号:

awk '/dhshunde/{print NR,$0}' userlog或grep -n dhshunde userlog 显示含有dhshunde的行号及内容

cat userlog |sed -n ‘/erptest/=’ 显示含有erptest的行号

cat userlog |sed -n '/xmdh/p'|sed -n '$p' 显示包含xmdh的最后一行

 

 

 

 

 

 

 

 

 

------------------------------

 

# 在每一行后面增加一空行
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/ .[09] [09]{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'

# 将分成多卷的uuencode文件解码。移除文件头信息,只保留uuencode编码部分。
# 文件必须以特定顺序传给sed。下面第一种版本的脚本可以直接在命令行下输入;
# 第二种版本则可以放入一个带执行权限的shell脚本中。(由Rahul Dhesi的一
# 个脚本修改而来。)
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode   # vers. 1
sed '/^end/,/^begin/d' "$@" | uudecode                    # vers. 2

# 将文件中的段落以字母顺序排序。段落间以(一行或多行)空行分隔。GNU sed使用
# 字元“\v”来表示垂直制表符,这里用它来作为换行符的占位符??当然你也可以
# 用其他未在文件中使用的字符来代替它。
sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g'
gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'

# 分别压缩每个.TXT文件,压缩后删除原来的文件并将压缩后的.ZIP文件
# 命名为与原来相同的名字(只是扩展名不同)。(DOS环境:“dir /b”
# 显示不带路径的文件名)。
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^ . \.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat


使用SED:Sed接受一个或多个编辑命令,并且每读入一行后就依次应用这些命令。
当读入第一行输入后,sed对其应用所有的命令,然后将结果输出。接着再读入第二
行输入,对其应用所有的命令……并重复这个过程。上一个例子中sed由标准输入设
备(即命令解释器,通常是以管道输入的形式)获得输入。在命令行给出一个或多
个文件名作为参数时,这些文件取代标准输入设备成为sed的输入。sed的输出将被
送到标准输出(显示器)。因此:

cat filename | sed '10q'         # 使用管道输入
sed '10q' filename               # 同样效果,但不使用管道输入
sed '10q' filename > newfile     # 将输出转移(重定向)到磁盘上

要了解sed命令的使用说明,包括如何通过脚本文件(而非从命令行)来使用这些命
令,请参阅《sed & awk》第二版,作者Dale Dougherty和Arnold Robbins
(O'Reilly,1997;http://www.ora.com ),《UNIX Text Processing》,作者
Dale Dougherty和Tim O'Reilly(Hayden Books,1987)或者是Mike Arst写的教
程??压缩包的名称是“U-SEDIT2.ZIP”(在许多站点上都找得到)。要发掘sed
的潜力,则必须对“正则表达式”有足够的理解。正则表达式的资料可以看
《Mastering Regular Expressions》作者Jeffrey Friedl(O'reilly 1997)。
Unix系统所提供的手册页(“man”)也会有所帮助(试一下这些命令
“man sed”、“man regexp”,或者看“man ed”中关于正则表达式的部分),但
手册提供的信息比较“抽象”??这也是它一直为人所诟病的。不过,它本来就不
是用来教初学者如何使用sed或正则表达式的教材,而只是为那些熟悉这些工具的人
提供的一些文本参考。

括号语法:前面的例子对sed命令基本上都使用单引号('...')而非双引号
("...")这是因为sed通常是在Unix平台上使用。单引号下,Unix的shell(命令
解释器)不会对美元符($)和后引号(`...`)进行解释和执行。而在双引号下
美元符会被展开为变量或参数的值,后引号中的命令被执行并以输出的结果代替
后引号中的内容。而在“csh”及其衍生的shell中使用感叹号(!)时需要在其前
面加上转义用的反斜杠(就像这样:\!)以保证上面所使用的例子能正常运行
(包括使用单引号的情况下)。DOS版本的Sed则一律使用双引号("...")而不是
引号来圈起命令。

'\t'的用法:为了使本文保持行文简洁,我们在脚本中使用'\t'来表示一个制表
符。但是现在大部分版本的sed还不能识别'\t'的简写方式,因此当在命令行中为
脚本输入制表符时,你应该直接按TAB键来输入制表符而不是输入'\t'。下列的工
具软件都支持'\t'做为一个正则表达式的字元来表示制表符:awk、perl、HHsed、
sedmod以及GNU sed v3.02.80。

不同版本的SED:不同的版本间的sed会有些不同之处,可以想象它们之间在语法上
会有差异。具体而言,它们中大部分不支持在编辑命令中间使用标签(:name)或分
支命令(b,t),除非是放在那些的末尾。这篇文档中我们尽量选用了可移植性较高
的语法,以使大多数版本的sed的用户都能使用这些脚本。不过GNU版本的sed允许使
用更简洁的语法。想像一下当读者看到一个很长的命令时的心情:

   sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d

好消息是GNU sed能让命令更紧凑:

   sed '/AAA/b;/BBB/b;/CCC/b;d'      # 甚至可以写成
   sed '/AAA\|BBB\|CCC/b;d'

此外,请注意虽然许多版本的sed接受象“/one/ s/RE1/RE2/”这种在's'前带有空
格的命令,但这些版本中有些却不接受这样的命令:“/one/! s/RE1/RE2/”。这时
只需要把中间的空格去掉就行了。

速度优化:当由于某种原因(比如输入文件较大、处理器或硬盘较慢等)需要提高
命令执行速度时,可以考虑在替换命令(“s/.../.../”)前面加上地址表达式来
提高速度。举例来说:

   sed 's/foo/bar/g' filename         # 标准替换命令
   sed '/foo/ s/foo/bar/g' filename   # 速度更快
   sed '/foo/ s//bar/g' filename      # 简写形式

当只需要显示文件的前面的部分或需要删除后面的内容时,可以在脚本中使用“q”
命令(退出命令)。在处理大的文件时,这会节省大量时间。因此:

   sed -n '45,50p' filename           # 显示第45到50行
   sed -n '51q;45,50p' filename       # 一样,但快得多

如果你有其他的单行脚本想与大家分享或者你发现了本文档中错误的地方,请发电
子邮件给本文档的作者(Eric Pement)。邮件中请记得提供你所使用的sed版本、 
该sed所运行的操作系统及对问题的适当描述。本文所指的单行脚本指命令行的长
度在65个字符或65个以下的sed脚本〔译注1〕。本文档的各种脚本是由以下所列作
者所写或提供:

Al Aab                               # 建立了“seders”邮件列表
Edgar Allen                          # 许多方面
Yiorgos Adamopoulos                  # 许多方面
Dale Dougherty                       # 《sed & awk》作者
Carlos Duarte                        # 《do it with sed》作者
Eric Pement                          # 本文档的作者
Ken Pizzini                          # GNU sed v3.02 的作者
S.G. Ravenhall                       # 去html标签脚本
Greg Ubben                           # 有诸多贡献并提供了许多帮助
-------------------------------------------------------------------------

译注1:大部分情况下,sed脚本无论多长都能写成单行的形式(通过`-e'选项和`;'
号)??只要命令解释器支持,所以这里说的单行脚本除了能写成一行还对长度有
所限制。因为这些单行脚本的意义不在于它们是以单行的形式出现。而是让用户能
方便地在命令行中使用这些紧凑的脚本才是其意义所在。

 

 

 

 

 

-------------------------------搜索
LoadModule php5_module        modules/libphp5.so
在这一行下,添加下面两行
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
====>>>>
sed -i '/LoadModule php5_module modules\/libphp5.so/a AddType application\/x-httpd-php .php .phtml\
AddType application\/x-httpd-php-source .phps' httpd.conf

 

 

 

 

 

 

 

 

sed缓冲区
sed 处理文件时,会把文件的每一行保存在一个临时缓冲区,即模式空间。
sed处理完一行后,该模式空间就被清空,下一行等待处理。因此可把模式空间内容用命令h复制并
保存在一个暂存缓冲区(holding buffer)内,然后可用命令G把它从暂存缓冲区读出一行,并放回模式空间缓冲区,
追加在模式空间内当前行的后面。
1. sed '/north/p' datafile
缺省情况下,sed会把输入的所有行都打印在标准输出上;如果某行匹配了north,则sed将该行再打印一遍。

2. sed -n '/north/p' datafile
只打印匹配north的行.

3.删除d
sed '3d' datafile   删除第3行
sed '3,$d' datafile  删除从第3行到结束
sed '$d' datafile  删除最后一行
sed '/north/d' file  删除匹配north的行

4.替换命令s
sed 's/west/north/g' datafile 全局替换
sed 's/[0-9][0-9]$/&.5/g' datafile
所有以两位数字结尾的行,后面加上.5(点5)

sed -n 's/ Mar got/\1lianne/p' datafile
Mar作为标签1,将Margot 替换成Marianne

sed 's#3#88#g' datafile等价于 sed 's/3/88/g' datafile

指定行范围:逗号
sed -n '/west/,/east/p' datafile 指定在模式west和east之间的行,打印
sed -n '5,/^northeast/p' datafile 打印从第5行到第一个以northeast开头的行之间的所有行
sed '/west/,/east/s/$' datafile修改从模式east和west之间的所有行,并将行尾$替换成**VACA**

多重编辑e
sed -e '1,3d' -e 's/Mike/Jones/' datafile
删除1到3行,然后再替换Mike为Jones(先全部执行完第一重编辑,再进行第二重编辑)

读入r
sed '/suan/r newfile' datafile
如果文件datafile中某一行匹配到模式suan,则在该行后读入newfile的内容。

写文件w
sed -n '/north/w newfile' datafile
如果文件datafile中某一行匹配到模式north,则把该行写入newfile文件中

追加
sed '/^north /a\\
----->THE NORTH SALES<------

插入
sed '/eastern/i\\
NEW ENGLAND REGION\\
----------------' datafile
下一行命令n
sed '/eastern/{n;s/AM/Archie/;}' datafile
如果某一行匹配到模式eastern,  命令n指示sed用下一输入行,即包含AM的那一行,
替换模式空间中的当前行,并用Archie替换AM,然后打印该行,再继续向下处理

转换y
sed '1,3y/abcdef/ABCDEF/' datafile
  把第1到3行中abcedf字母转换成大写字母

退出q
sed '5q' datafile打印5行后退出
sed '/Lewis/{s/Lewid/Joseph/;q;} datafile
  某行匹配到Lewis时,先用Joseph替换Lewis,然后立即退出

暂存和取用(h和g命令)
sed -e '/WE/{h;d;}' -e '/CT/{G;}' datafile
找到某一行匹配模式WE,用命令h将该行从模式缓冲区拷贝到一个暂存缓冲区,再用命令d把
该模式空间缓冲区那份拷贝删除。找到模式CT后,再用G命令取出保存在暂存缓冲区中的副本,
用其替换模式空间当前行。

暂存和互换命令x
sed -e '/Patricia/h' -e '/Margot/x' datafile
x命令将暂存区的内容和模式空间内的当前行互换
sed脚本编程:把sed组成一个文本文件,执行脚本时,sed 先将输入文件中第一行拷贝到模式缓冲区
,然后执行脚本中的所有命令;每行处理完毕后,sed再拷贝文件中下一行到模式缓冲区,
执行脚本中的所有命令。
如:
/Lewis/a\
     Lewis is TOP salesperson for April!!!\
     Lewis is moving to the southern district next month.\
/Margot/c\
    ********************
    MARGOT HAS RETIRED\
    ********************
/i\
   mployer database\
   _________________

$d

%sed -f filename datafile
sed -n '/sentimeatal/p' filename
sed '1,3d' filename > newfile
sed '/[Dd]aniel/d' filename
sed -n '15,20p' filename
sed '/1,10s/Montana/MT/g' filename
sed '/March/!d' filename
sed '/March/\!d' filename
sed 's/ [Oo]cuur ence/\1rence' file
sed '/^....//' file删除每行前4个字符
sed '/....$//' file删除每行后4个字符
sed '/east/,/west/s/North/South/' filename
把从east到west范围内出现的第一个North替换成South,只一次

 

 

sed 's/%//g'  把%换成空格

sed 's/^0*//g' 把以0开头的数字换成空格

sed /^$/d  删除空行

sed $d 删除最后一行

sed ld 删除第一行

sed 's/[0-9][0-9]*/&  password/g'  file.txt   把password连接到

       

在新闻组里有人这么用,挺经典!
cat test | sed "11,19 d" >> test2
删除文件中的11~19行。

 

 

 

 

 

--------------------linux sed 批量替换字符串

比如,要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做:

sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /modules`

解释一下:

-i 表示inplace edit,就地修改文件
-r 表示搜索子目录
-l 表示输出匹配的文件名

这个命令组合很强大,要注意备份文件。


(1)sed 'y/1234567890/ABCDEFGHIJ/' test_sed
sed 'y/1234567890/ABCDEFGHIJ/' filename
ABCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC
注意变换关系是按两个list的位置对应变换
其中:test_sed的内容是:
1234567890
2345678901
3456789012
4567890123

(2)替换每行所有匹配
sed 's/01/Ab/g' test_sed
1234567890
23456789Ab
3456789Ab2
456789Ab23
注意:第一行的0,1没有分别替换为A,b


删除:d命令  

    *      $ sed '2d' example-----删除example文件的第二行。
    *      $ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
    *      $ sed '$d' example-----删除example文件的最后一行。
    *      $ sed '/test/'d example-----删除example文件所有包含test的行。


替换:s命令  

    *      $ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
    *      $ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
    *      $ sed 's/^192.168.0.1/&localhost/'example-----&符号表示替换换字符串中被找到的部份。所有以 192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。
    *      $ sed -n 's/ love able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
    *      $ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。


选定行的范围:逗号

    *      $ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。
    *      $ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
    *      $ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。


多点编辑:e命令  

    * $ sed -e '1,5d' -e 's/test/check/'example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用 check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
    *      $ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。


从文件读入:r命令  

    *      $ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。


写入文件:w命令  

    *      $ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。


追加命令:a命令  

    *      $ sed '/^test/a\\--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。


插入:i命令 $ sed '/test/i\\
new line
-------------------------' example
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
下一个:n命令  

    *      $ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。


变形:y命令  

    *      $ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。


退出:q命令  

    *      $ sed '10q' example-----打印完第10行后,退出sed。


保持和获取:h命令和G命令  

    * $ sed -e '/test/h' -e '$Gexample-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。


保持和互换:h命令和x命令  

    *      $ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。


      7. 脚本

Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

     8. 小技巧
  

    *      在sed的命令行中引用shell变量时要使用双引号,而不是通常所用的单引号。下面是一个根据name变量的内容来删除named.conf文件中zone段的脚本:
           name='zone\ "localhost"'
      sed "/$name/,/};/d" named.conf


sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`

例如:替换/home下所有文件中的www.itbbs.cn为chinafar.com

sed -i "s/www.itbbs.cn/chinafar.com/g" `grep www.itbbs.cn -rl /home`

二、下面这条命令:
perl -pi -e 's|ABCD|Linux|g' `find ./ -type f`
将调用perl执行一条替换命令,把find命令找到的所有文件内容中的ABCD替换为Linux

find ./ -type f
此命令是显示当前目录下所有的文件

上面的“s|ABCD|Linux| g”是perl要执行的脚本,即把所有ABCD替换为Linux
如果不写最后的那个g,“s|ABCD|Linux| ”将只替换每一行开头的ABCD


当编辑指令(参照[section2.2])在命令列上执行时,其前必须加上选项-e。其命令格式如下:

sed-e'编辑指令1'-e'编辑指令2'...文件档

其中,所有编辑指令都紧接在选项-e之後,并置於两个"'"特殊字元间。另外,命令上编辑指令的执行是由

左而右。

一般编辑指令不多时,使用者通常直接在命令上执行它们。

例如,删除yel.dat内1至10行资料,并将其馀文字中的"yellow"字串改成"black"字串。此时,可将编辑指令直接在命令上执行,其命令如下:

sed-e'1,10d'-e's/yellow/black/g'yel.dat

在命令中,编辑指令'1,10d'(解[5])执行删除1至10行资料;编辑指令's/yellow/black/g'(解[6]),

"yellow"字串替换(substuite)成"black"字串。

2.2sed的编辑指令

sed编辑指令的格式如下:

[address1[,address2]]function[argument]

其中,位址参数address1、address2为行数或regularexpression字串,表示所执行编辑的资料行;函数参

数function[argument]为sed的内定函数,表示执行的编辑动作。

下面两小节,将仔细介绍位址参数的表示法与有哪些函数参数供选择。

2.2.1位址(address)参数的表示法

实际上,位址参数表示法只是将要编辑的资料行,用它们的行数或其中的字串来代替表示它们。下面举几个例子

说明(指令都以函数参数d(参照[section4.2])为例):

删除档内第10行资料,则指令为10d。

删除含有"man"字串的资料行时,则指令为/man/d。

删除档内第10行到第200行资料,则指令为10,200d。

删除档内第10行到含"man"字串的资料行,则指令为10,/man/d。

接下来,以位址参数的内容与其个数两点,完整说明指令中位址参数的表示法(同样也以函数参数d为例)。

位址参数的内容:

位址为十进位数字:此数字表示行数。当指令执行时,将对符合此行数的资料执行函数参数指示的编辑动作。例如,

删除资料档中的第15行资料,则指令为15d(参照[section4.2])。其馀类推,如删除资料档中的第m行资料,则

指令为md。

位址为regularexpression_r(参照[附录A]):

当资料行中有符合regularexpression所表示的字串时,则执行函数参数指示的编辑动作。另外,在

regularexpression前後必须加上"/"。例如指令为/t.*t/d,表示删除所有含两"t"字母的资料行。其中,"."

表示任意字元;"*"表示其前字元可重任意次,它们结合".*"表示两"t"字母间的任意字串。

位址参数的个数:在指令中,当没有位址参数时,表示全部资料行执行函数参数所指示的编辑动作;当只有一位址

参数时,表示只有符合位址的资料行才编辑;当有两个位址参数,如address1,address2时,表示对资料区执行

编辑,address1代表起始资料行,address2代表结束资料行。对於上述内容,以下面例子做具说明。

例如指令为

d

其表示删除档内所有资料行。

例如指令为

5d

其表示删除档内第五行资料。

例如指令为

1,/apple/d

其表示删除资料区,由档内第一行至内有"apple"字串的资料行。

例如指令为

/apple/,/orange/d

其表示删除资料区,由档内含有"apple"字串至含有"orange"字串的资料行

2.2.2有那些函数(function)参数

下页表中介绍所有sed的函数参数(参照[chapter4])的功能。

函数参数功能

:label建立scriptfile内指令互相参考的位置。

 

 

 

 

 

 

 

 

 

-------------------------------------------

如有一文件,test.txt,内容如下:

http://www.5566.cn/produce/20070804112/315613171.shtml
http://bj.5566.cn/produce/20070804112/31581217.shtml
http://sz.5566.cn/produce/2008090412/31581247.shtml

要求如下:将http://*.5566.cn/替换成/home/html/www.5566.cn,要求用sed,看大家做下,晚点我将公布的做法,我想得出一个最简单实现的方法>

 

 

# sed -n 's/http.*\.cn/home\/html\/www.5566.cn/gp' test
home/html/www.5566.cn/produce/20070804112/315613171.shtml
home/html/www.5566.cn/produce/20070804112/31581217.shtml
home/html/www.5566.cn/produce/2008090412/31581247.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值