Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

sed命令 几个常用的用法

Posted on 2009-09-08 12:49 Prayer 阅读(524) 评论(0)  编辑 收藏 引用 所属分类: Shell
1.去掉所有行的空格
sed   -i ’s/ //g’ df.txt
2.去掉所有行的空格
sed   -e ’s/ //g’ df.txt   >cwm.txt

3.将每一行拖尾的“空白字符”(空格,制表符)删除
sed ’s/ *$//’   df.txt >cwm.txt

4.将每一行中的前导和拖尾的空白字符删除
sed ’s/^ *//;s/ *$//’   df.txt >cwm.txt

5.去掉空行
sed ’/^$/d’ df.txt   >cwm.txt
sed -e ’/^$/d’ df.txt   >cwm.txt
sed -i ’/^$/d’ df.txt  
这三个是等价的 但第三个会改动原文件

6.去掉windows下的回车符 (注意^M 在linux 下写法 按^M 是回车换行符,输入方法是按住CTRL+v,松开v,按m)
sed   -i ’s/^M//g’   df.txt  

7.去掉windows下的回车符 (注意^M 在linux 下写法 按^M 是回车换行符,输入方法是按住CTRL+v,松开v,按m)
sed   -e ’s/^M//g’   df.txt   >cwm.txt



也等价于
dos2unix df.txt   >cwm.txt  


----------------------------------------------------------------------------------------------
******怎么去掉文件中行尾的回车符号^M******
sed ’s/^M//g w newfilename’ oldfilename
其中:
s   表示Searchg 表示搜索全文,缺省是搜索第一个^M 是回车换行符,输入方法是按住CTRL+v,松开v,按m  
w   表示写到新文件中.


例子1
86103113234778,
86103145878770,
86103116778768,
86103111879708,
sed ’s/^86//;s/,$//’ user.txt     #去掉开头的86 及尾部的,号
例子2
103113234778
103145878770
103116778768
103111879708
sed -e ’s/^/86/’ user.txt    #每行行首加上86
86103113234778
86103145878770
86103116778768
86103111879708

*********************************************************
http://www.idcnews.net/html/edu/20080425/300682.html

1. sed 命令简介
Sed(a stream editor)是流线型、非交互式编辑器。他允许您执行和vi编辑器里相同的编辑任务。Sed 程式不是和编辑器交互式工作的,而是让您在命令行里敲入编辑的命令,给文档命名,然后在屏幕上查看命令输出结果。
2. sed 怎样工作
sed 编辑器按一次处理一行的方式来处理文档,并把输出送到屏幕上。
3. sed 能够用寻址的方式来决定想要编辑哪一行。
4. sed 命令和选项
选项     功能
a\    在当前行上添加一个文本行或多个文本行
c\    用新闻本改变(取代)当前行里的文本
d    删除行
i\    在当前行之前插入文本
h    把模式空间内容复制到一个固定缓存
H    把模式空间内容添加到一个固定缓存
g    得到固定缓存里任何的并复制到模式缓存,重写其内容
G    得到固定缓存的内容并复制到模式缓存,添加到里面
I    列出不打印的字符
p    打印行
n    读下一输入行,并开始用下一个命令处理换行符,而不是用第一个命令
q    结束或退出sed
r    从一个文档读如行
!    把命令应用到除了选出的行以外的其他任何行
s    把一个字串替换成另一个替换标志
g    在一行上进行全局替换
p    打印行
w    把行写到一个文档中
x    用模式空间的内容交换固定缓存的内容
y    把一个字符转换成另一个(不能和整则表达式元字符一起使用)
5、 sed元字符
基本上,grep和vi使用的元字符都能够用在sed中,&是特例:
   & :保存搜索串以便能够记在替换串里
e.g.: s/love/**&**/
    &号代表搜索串。串love将被星号包围的自身所替代;即love变成**love**

6 sed实例
   1> 打印:p命令
    sed ’/north/p’ datafile
   默认输出任何行,找到north的行重复打印
    sed ?n ’/north/p’ datafile
   禁止默认输出,只打印找到north的行
   2> 删除:d命令
    sed ’3d’ datafile
   删除第三行,其余行输出到屏幕
    sed ’3,$d’ datafile
   从第3行到最后一行都删除,将剩余部分输出到屏幕
    sed ’/north/d’ datafile
   将含有north的行删除,其余输出到屏幕
   3> 替换:s命令
    sed ’s/west/north/g’ datafile
   解释:找到datafile中的任何west并替换成north,将替换后的内容输出到屏幕。
    sed ’s/[0-9][0-9]$/&.5/’ datafile
   解释:在替代串里的&字符代表在搜索串中真正找到的。
         每个以两个数字结尾的行都被他自己取代,且要在后面加上.5
    sed -n ’s/Hemenway/Jones/gp’ datafile
   解释:任何的Hemenway所在的位置都用Jones来取代,而且只有改变的行被打印。
         -n和p命令选项相结合来禁止默认输出。g代表全局替换
    sed -n ’s/\(Mar\)got/\1ianne/p’ datafile
   解释:模式Mar被封装在括弧里且在一个专用寄存器里存为标记1。
         在替换串里他将被引用做\1。然后用Marianne替代Margot。
    sed ’s#3#88#g’ datafile
   解释:s命令后面的字符是搜索串和替换串之间的分界符。
         默认的分界符是个正斜杠,但也能够改变(只有使用s命令时)。
         无论s命令后面跟什么字符,他都是新的串分界符。
         当搜索包含一个正斜杠的模式,如路径或生日时,这种技巧可能有用
   4> 被选中的行的范围:逗号
    sed -n ’/west/,/east/p’ datafile
         打印在west和east之间的模式范围内任何行。假如west出现在east之后,
         则打印从west到下一个east或到文档末尾的行,无论哪种情况先出现都能够。
    sed ’/west/,/east/s/$/**VACA**/’ datafile
   解释:对于在模式west到east范围内的行,行末尾将用**VACA**来取代。
   5> 多次编辑 -e 选项
    sed -e ’1,3d’ -e ’s/Hemenway/Jones/’ datafile
      -e选项允许多次编辑。不同的编辑顺序可能导致不同的结果。
      例如,假如两个命令都执行了替换,第一次替换可能影响第二次替换。
   6> 从文档中读取:r命令
    sed ’/Suan/r newfile’ datafile
   解释:r命令从newfile中读取内容,将内容输出到Suan的后面。
         假如datafile中Suan出现的次数不只一次,则分别放到Suan的后面。
   7> 写入文档:w命令
    sed -n ’/north/w newfile’ datafile
   解释:w命令把指定的行写入到一个文档。
         本例中任何的包含north的行写入到newfile中。
         等同于sed -n ’/north/p’ datafile >newfile
   8> 添加:a命令
    $ sed ’/north/a\
   > ---->THE NORTH SALES DISTRICT HAS MOVEDTHE NORTH SALES DISTRICT HAS MOVED 插入:i命令
$ sed ’/north/i\
   > ---->THE NORTH SALES DISTRICT HAS MOVEDTHE NORTH SALES DISTRICT HAS MOVED下一个:n命令
    $ sed ’/eastern/{n;s/AM/Archie/;}’ datafile

    eastern EA TB Savage 4.4 .84 5 20
    northeast NE Archie Main Jr. 5.1 .94 3 13
    ……
   解释:假如在某一行里模式eastern被匹配,n命令使sed区的下一行,
          用该行代换模式空间,用Archie替换AM,打印并继续。
   11>变换:y 命令
sed ’1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/’ datafile
   解释:将对应字母进行转换。
   12>退出:q 命令
sed ’5q’ datafile
   解释:在打印了5行之后,用q命令退出sed程式。
   13>保存和取得:h和G命令
$ sed -e ’/southeast/h’ -e ’$G’ datafile
   解释:当sed 处理文档时,每行都存在模式空间(pattern space)的临时缓存中。除非行被禁止打印或删除,否则行将在处理完后被打印到屏幕,然后请模式空间并把下一输入行保存在那里等待处理。在这个例子中, 在找到模式之后,把他放在模式空间里,而且h命令复制他并把他存到另一个叫做保存缓存(holding buffer)中。第二个sed指令里,当读入最后一行($)时,G命令告诉sed从包存缓存中取得该行并放回模式空间缓存,添加到当前存在那里的行中。 本例子就是最后一行。
$ sed -e ’/WE/{h;d;}’ -e ’/CT/G’ datafile
   解释:第一个命令h将找到了WE的行放到保存缓存中,然后删除该行;第二个命令/CT/G就是在找到了CT的行的后面加入保存缓存的内容。

14>G和g的区分
   G命令在符合的条件行后面添加保存缓存中的内容;g命令用保存缓存中
15>sed 命令的花括号{}的作用
   花括号{}中能够放入多个命令,每个命令后面要用分号;。
16>保存和交换:h 和 x命令。
   $ sed -e ’/Patricia/h’ -e ’/Margot/x’ datafile
   解释:x命令将找到的行用保存缓存中的内容替换。
7. 用sed来编写命令表
sed 命令表(script)是文档里的一个sed命令列表。用-f选项来引用一个命令表文档。编辑sed命令表有特别需要:命令末尾不能有任何尾随的空白符或文本。假如命令不是自成一行,就必须用分号结束。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理