通过例子学习sed的用法

1,sed介绍
   
sed可删除(delete)、改变(change)、添加(append)、插入(insert)、合、交换文件中的资料行,或读入其它档的资料到
文>件中,也可替换(substuite)它们其中的字串、或转换(tranfer)其中的字母等等。例如将文件中的连续空白行删成一
行、"local"字串替换成"remote"、"t"字母转换成"T"、将第10行资料与第11资料合等.
   
总合上述所言,当sed由标准输入读入一行资料并放入pattern space时,sed依照sed script 的编辑指令逐一对pattern
space内的资料执行编辑,之後,再由pattern
space内的结果送到标准输出,接着再将下一行资料读入.如此重执行上述动作,直至读>完所有资料行为止.
    小结,记住:
            (1)sed总是以行对输入进行处理
            (2)sed处理的不是原文件而是原文件的拷贝

命令行概述:
    sed 编辑指令的格式如下 :
              [address1[,address2]]function[argument]
其中 , 位址参数 address1 、address2 为行数或 regular expression 字串 , 表示所执行编辑的资料行; 函数参数 function[argument] 为 sed 的内定函数 , 表示执行的编辑动作。

有那些函数(function)参数
   下页表中介绍所有 sed 的函数参数(参照[chapter 4])的功能。
函数参数 功能
: label  建立 script file 内指令互相参考的位置。
#  建立解
{ }  集合有相同位址参数的指令。
!  不执行函数参数。
=  印出资料行数( line number )。
a/  添加使用者输入的资料。
b label  将执行的指令跳至由 : 建立的参考位置。
c/  以使用者输入的资料取代资料。
d  删除资料。
D  删除 pattern space 内第一个 newline 字母 / 前的资料。
g  拷贝资料从 hold space。
G  添加资料从 hold space 至 pattern space 。
h  拷贝资料从 pattern space 至 hold space 。
H  添加资料从 pattern space 至 hold space 。
l  印出 l 资料中的 nonprinting character 用 ASCII 码。
i/  插入添加使用者输入的资料行。
n  读入下一笔资料。
N  添加下一笔资料到 pattern space。
p  印出资料。
P  印出 pattern space 内第一个 newline 字母 / 前的资料。
q  跳出 sed 编辑。
r  读入它档内容。
s  替换字串。
t label  先执行一替换的编辑指令 , 如果替换成牛p>则将编辑指令跳至 : label 处执行。
w  写资料到它档内。
x  交换 hold space 与 pattern space 内容。
y  转换(transform)字元。
虽然 , sed 只有上表所述几个拥有基本编辑功能的函数 , 但由指令中位址参数和指令与指令间的配合 , 也能使sed 完成大部份的编辑任务。

2,1 删除
(1) sed -e '1d' inputfile (删除第一行)
    那么删除第x行呢?删除第x1,x2,x3行呢?
    sed -e 'xd' inputfile
    sed -e 'x1d' -e 'x2d' -e 'x3d' inputfile
    当然也许还有更好的办法。

(2) sed -e '1,3d' file (删除第一到第三行)
    思考:删除第n行到第m行?也就是
    sed -e 'n,md' file
    删除第一行到最后一行
    sed -e '1,$d' file     #$ 最后一行和一行的最后

(3) sed -e '/#/d' file  (删除含有'#'号的行)
    思考:删除含有字母xx的行
    sed -e '/xx/d' file
    思考: 删除除含有字符串xx的所有行
    sed -e '/xx/!d' file

(4) sed -e '/word1/, /word2/d' file  (删除从含有单词word1到含有单词word2的行)
    sed -e '10,/word1/d' file
    删除文件中从第10行到含有word1的行
    sed -e '/word1/,10/d' file
    和上面的匹配相反,删除从含有word1的行到第10行

(5) sed -e '/t.*t/d' file     (删除含有两个t的行)
    思考:删除含有指定正在表达式匹配的行。

2.2 替换      
Sed 可替换文件中的字串、资料行、甚至资料区。其中,表示替换字串的指令中的函数参数为s;表示替换资料行、或资料区>的指令中的函数参数为c。上述情况以下面三个例子说明。

*行的替换
(1) sed -e '1c/#!/bin/more' file (把第一行替换成#!/bin/more)
    思考: 把第n行替换成just do it
    sed -e 'nc/just do it' file

(2) sed -e '1,10c/I can do it' file  (把1到10行替换成一行:I can do it)
    思考: 换成两行(I can do it! Let's start)
    sed -e '1,10c/I can do it!/nLet'"/'"'s start' file

*字符的替换
(3) sed -e 's/word1/& word2/' file (将每一行的word1单词替换成s参数最多与两个位置参数相结合,函数参数s中有两个特殊的符号:
    & : 代表pattern
    /n : 代表 pattern 中被第 n 个 /( 、/)(参照[附录 A]) 所括起来的字串。例如

sed -e 's/w1/& w2/' file  # w1的地方输出 w1 w2
    sed -e  's//(test/) /(my/) /(car/)/[/2 /3 /1]/' file   #结果: [my car test]

*flag 参数举例
    sed -e 's/w1/& w2/g' file
    g : 代表替换所有匹配项目;这里,文件中所有字符串w1都会被替换成字串w1 w2
    sed -e 's/w1/& w2/10' file
    m(10) : 替换行内第m个符合的字串; 记住,是行内的第m个匹配的字串
    sed -e 's/w1/& w2/p' file
    p : 替换第一个和w1匹配的字符串为w1 w2,并输出到标准输出.
    sed -e 's/w1/& w2/w w2file' file
    w filename : 该参数会将替换过的内容写入到文件w2file并输出替换后的整个文件。注意w2file里写的只是替换过的行。    sed 'e 's/w1/& w2/' file
    这里的flag 为空, 这样就只是将第一个w1匹配的字符串替换成w1 w2而后面的不进行替换。

*位置参数应用举例
    sed -e '/machine/s/phi/beta/g' file
    将文件中含"machine"字串的资料行中的"phi"字串,替换成为"beta"字串
    sed -e '1,10 s/w1/& w2/g' file
    把1到10内的w1字符串替换成w1 w2字符串。
    sed -e '1,/else/ s/w1/& w2/g' file
    把1到字符串else内的w1字符串替换成w1 w2字符串。

其它位置参数的应用与前面的相同。

2.3 内容的插入
i
    基本格式:
    [address] i/ 插入内容 filename
 word2)
说明:
函数参数 s 表示替换(substitute)文件内字串。其指令格式如下 :
[address1[ ,address2]] s/pattern/replacemen/[flag]

sed -e '/#/i/words' file      #在#字符的前面插入一行words

说明:
    这里的函数参数是i,它只能有一个地址参数。
    sed -e '1/i/words' file
    在第一行前加一行words
    cat "word" | sed -e '/$/.doc/g'   #输出word.doc
    在word后面加上后缀名,从而输出word.doc
    i 参数正好与a参数相反,它是插入到所给内容的前面.

a
    a参数的使用格式如下:
    [address] a/ <插入内容> filename

sed -e '/unix/a/ haha' test.txt   #在含有unix的行后添加"haha"
    #输出结果为:
        unix
        haha

另外: sed -e '1 a/ hh' test.txt  #在第一行后添加hh字符.

2.4 文本的打印: p
    基本格式:
    [address1,[address2]] p

(1) sed -e '/then/ p' filename  #打印所有行并重复打印含有then 的行
    (2) sed -n '/then/ p' filename  #只打印含有then的行
    (3) sed -e '1,3 p' filename     # 打印所有行并重复1-3行
    (4) sed -n '1,3 p' filename     # 打印1-3行
    (5) sed -n '/if/,/fi/ p' filename #打印字符if和fi之间的内容

p函数为sed的打印函数,在这里要注意-e 和-n 参数的区别。一般使用-n参数。

2.5 字元的替换: y
    例如:
    (1)sed -e 'y/abc../xyz../' filename
    把文件中的a字母替换成x, b替换成y, c替换成z。
    (2) sed  -e 'y/abc/ABC' filename
    把小写的abc转换成大写的ABC

2.6 反相执行命令 : !
    基本格式:
    [address1[ , address2]] ! 函数参数

sed -e '/1996/!d' filename
    删除除了含有1996的所有行。

2.7 改变文件中的资料: c
    基本格式:
    [address1[ ,address2]]c/ filename
    函数参数 c 紧接着 "/" 字元用来表示此行结束 , 使用者所输入的资料必须从下一行输入。如果资料超过一行 , 则须在>每行的结尾加入"/"

sed -e '/zhengxh/c hhhh' filename
    表示把含有字符串zhengxh的行,该成hhhh。

2.8 读入下一行资料: n
    基本格式:
    [address1[ ,address2]] n

sed -n -e '/echo/n' -e 'p' temp
    表示输出文件,但如果一行含有字符串echo,则输出包含该字符串的下一行。
    sed -n -e 'n' -e 'p' filename
    输出文中的偶数行

3, 命令的复用
    一次执行多个命令的方式有三种:
    (1) sed 's/w1/& w2/g; 1/i/words' filename   (使用;号把命令隔开,注意前面不加-e参数)
    (2) sed -e 'cmd1' -e 'cmd2'  filename     (使用多个-e参数)

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

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回 车>”,即“\n\r”。一个直接后果是,Unix系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在 Unix下打开的话,在每行的结尾可能会多出一个^M符号。

好了,所以我的问题就出在被处理的文件的每行末尾都有^M符号,而这通常是看不出来的。可以用"cat -A test.file"命令查看。因此当我想在行尾添加字符的时候,它总是添加在行首且会覆盖掉原来行首的字符。

要把文件转换一下,有两种方法:

1.命令dos2unix test.file

2.去掉"\r" ,用命令sed -i 's/\r//' test.file

好了,这样处理完,就OK啦!!!

awk函数的定义方法如下:  function 函数名(参数表){  函数体  }
 
sed -e 's/123/1234/' a.txt 
将a.txt文件中所有行中的123用1234替换(-e表示命令以命令行的方式执行;参数s,表示执行替换操作) 
# sed -e '3,5 a4' a.txt 
将a.txt文件中的3行到5行之间所有行的后面添加一行内容为4的行(参数a,表示添加行,参数a后面指定添加的内容) 
# sed -e '1 s/12/45/' a.txt 
把第一行的12替换成45 
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir` 
批量处理通过grep搜索出来的所有文档,将这些文档中所有的oldstring用newstring替换(-i参数表示直接对目标文件操作) 
$ sed -n 's/^test/mytest/p' example.file 
(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。(^这是正则表达式中表示开头,该符号后面跟的就是开头的字符串)(参数p表示打印行) 
$ sed 's/^wangpan/&19850715/' example.file 
表示被替换换字符串被找到后,被替换的字符串通过&符号连接给出的字符串组成新字符传替换被替换的字符串,所有以wangpan开头的行都会被替换成它自已加19850715,变成wangpan19850715 
$ sed -n 's/\(love\)able/\1rs/p' example.file 
love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。需要将这条命令分解,s/是表示替换操作,\(love\)表示选中love字符串,\(love\)able/表示包含loveable的行,\(love\)able/\l表示love字符串标记为1,表示在替换过程中不变。rs/表示替换的目标字符串。这条命令的操作含义:只打印替换了的行 
$ sed 's#10#100#g' example.file 
不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。 
$ sed -n '/love/,/unlove/p' example.file 
只打印包含love字符串行到包含unlove字符串行之间的所有行(确定行的范围就是通过逗号实现的) 
$ sed -n '5,/^wang/p' example 
只打印从第五行开始到第一个包含以wang开始的行之间的所有行 
$ sed '/love/,/unlove/s/$/wangpan/' example.file 
对于包含love字符串的行到包含unlove字符串之间的行,每行的末尾用字符串wangpan替换。 
字符串$/表示以字符串结尾的行,$/表示每一行的结尾,s/$/wangpan/表示每一行的结尾添加wangpan字符串 
$ sed -e '11,53d' -e 's/wang/pan/' example.file 
(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除11至53行,第二条命令用pan替换wang。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。(参数d,表示删除指定的行) 
$ sed --expression='s/wang/pan/' --expression='/love/d' example.file 
一个比-e更好的命令是--expression。它能给sed表达式赋值。 
$ sed '/wangpan/r file' example.file 
file里的内容被读进来,显示在与wangpan匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。参数r,表示读出文件,后面空格紧跟文件名称 
$ sed -n '/test/w file' example.file 
在example.file中所有包含test的行都被写入file里。参数w,表示将匹配的行写入到指定的文件file中 
$ sed '/^test/a\oh! My god!' example.file 
'oh! My god!'被追加到以test开头的行的后面,sed要求参数a后面有一个反斜杠。 
$ sed '/test/i\oh! My god!' example.file 
'oh! My god!'被追加到包含test字符串行的前面,参数i表示添加指定内容到匹配行的前面,sed要求参数i后面有一个反斜杠 
$ sed '/test/{ n; s/aa/bb/; }' example.file 
如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb。参数n,表示读取匹配行的下一个输入行,用下一个命令处理新的行而不是匹配行。Sed要求参数n后跟分号 
$ sed '1,10y/abcde/ABCDE/' example.file 
把1—10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。参数y,表示把一个字符翻译为另外的字符(但是不用于正则表达式) 
$ sed -i 's/now/right now/g' test_sed_command.txt 
表示直接操作文件test_sed_command.txt,将文件test_sed_command.txt中所有的now用right now替换。参数-i,表示直接操作修改文件,不输出。 
$ sed '2q' test_sed_command.txt

在打印完第2行后,就直接退出sed。参数q,表示退出 
$ sed -e '/old/h' -e '/girl-friend/G' test_sed_command.txt 
首先了解参数h,拷贝匹配成功行的内容到内存中的缓冲区。在了解参数G,获得内存缓冲区的内容,并追加到当前模板块文本的后面。上面命令行的含义:将包含old字符串的行的内容保存在缓冲区中,然后将缓冲区的内容拿出来添加到包含girl-friend字符串行的后面。隐含要求搜集到缓冲区的匹配行在需要添加行的前面。 
$ sed -e '/test/h' -e '/wangpan/x' example.file 
将包含test字符串的行的内容保存在缓冲区中,然后再将缓冲区的内容替换包含wangpan字符串的行。参数x,表示行替换操作。隐含要求搜集到缓冲区的匹配行在需要被替换行的前面。

Shell之sed用法 转滴的更多相关文章

  1. shell中sed用法

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  2. Shell:sed用法 - 查找并替换字符串

    原文链接 语法 sed 's/serach_str/replace_str/g' file_path 在某个文件中查找所有的serach_str并替换为replace_str 参数 描述 serach ...

  3. shell编程——sed用法之参数详解

    sed格式: sed 参数 '正则表达式' 文件名 sed的常见参数有以下几种: 1.-n, --quiet, --silent 取消自动打印模式 不加n默认打印整个文件: [root@localho ...

  4. shell编程——sed用法

    一.sed格式: sed 参数 '正则表达式' 文件名 演示文件的内容: [root@localhost ~]# cat test.sh #!/bin/bash 第一行 12345! 第二行 2345 ...

  5. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

  6. Linux shell利用sed如何批量更改文件名详解[转载]

     需求背景: 目录A用来存放自动化的包生成的apk文件,现在开发修改了包名的 命名规则:环境名称(pro|uat)-release-日期-v版本号.apk 原来的是思路是通过正则表达式匹配新的包名,但 ...

  7. shell中sed的简单使用

    sed命令行格式为:         sed [-nefri]  ‘command’  输入文本/文件        常用选项:        -n∶取消默认的输出,使用安静(silent)模式.在一 ...

  8. linux学习基础6之sed用法详解

    1 sed 又称为流编辑器,它逐行将文本文件中的行读取到模式空间中间去,将符合编辑条件的行进行编辑后输出到显示器上来.默认sed不编辑原文件只处理模式空间中的内容. 2 sed用法 sed [opti ...

  9. Shell expr的用法 bc 命令 let命令

    Shell expr的用法  bc 命令   let命令 数学运算 let命令  expr命令  bc命令  $(())   $[] http://www.80ops.cn/archives/245. ...

随机推荐

  1. 【云计算】Docker集中化web界面管理平台shipyard

    Docker集中化web界面管理平台shipyard docker shipyard seanlook                        2015年01月05日发布             ...

  2. CSS用Id选择器在本页写样式

    <title>静夜思</title><style type="text/css">#red{color:#ff0000; font-weight ...

  3. python在线文档

    中文 http://python.usyiyi.cn/--------------------------不完整 http://www.pythondoc.com/pythontutorial27/i ...

  4. Javascript配合jQuery实现流畅的前端验证

    做前端时一般都习惯用JavaScript进行表单的简单验证比如非空验证和正则表达式验证,这样过滤后的数据提交到服务端再由专门的控制器做数据处理,这样能减轻服务器的负担,下面看一下前端验证的简单步骤: ...

  5. MinGW/MSYS 交叉编译环境搭建

    因为包的依赖关系不清楚,搭建时出错也不知道是什么原因,下面链接老外写的搭建步骤,写的非常详细还有脚本 已经编译的下载地址 http://ingar.satgnu.net/devenv/mingw32/ ...

  6. DFS:Lake Counting(POJ 2386)

    好吧前几天一直没更新博客,主要是更新博客的确是要耗费一点精力 北大教你数水坑 最近更新博客可能就是一点旧的东西和一些水题,主要是最近对汇编感兴趣了嘻嘻嘻 这一题挺简单的,没什么难度,简单深搜 #inc ...

  7. python scrapy cannot import name xmlrpc_client的解决方案,解决办法

    安装scrapy的时候遇到如下错误的解决办法: "python scrapy cannot import name xmlrpc_client" 先执行 sudo pip unin ...

  8. July 12th, Week 29th Tuesday, 2016

    When the traveler goes alone he gets acquainted with himself. 独自旅行可以让人更好地了解自己. With other's company, ...

  9. Ubuntu 更新源

    1.首先备份Ubuntu12.04源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup (备份下当前的源列表) 2.修改更新源 ...

  10. PW试验-----verilog

    PWM,脉冲宽度调制.顾名思义,是通过调制脉冲的宽度,即占空比,来实现的.可是使占空比逐渐由最小增加到最大,也可以使占空比由最大减少到最小来实现不同的现象.若用LED灯来显示现象,则可以称作:LED呼 ...