首页 > 学院 > 开发设计 > 正文

Ubuntu下使用sed命令处理文本

2019-11-06 09:55:11
字体:
来源:转载
供稿:网友

先举个简单的例子:

有个文件叫example.txt

内容为 aaa 

使用sed命令删除第一行

sed '$d' example.txt > example.txt

那么第一行就会被删除了    

 现在需要对txt文件的每行行首加上绝对路径,一开始编写的shell脚本,提示更改成功了,但不知道还要将输出进行重定向,于是换了vim打开文件进行修改。

1、首先,因为绝对路径里包含/这样的字符,可以使用/进行转义,假定要修改的文件名为test.txt,要在行首加入字符/finetune_caviar/,shell脚本编写如下:

sed 's/^///finetune_caviar//&/g' test.txt

介绍下该命令:

(1)sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,命令格式为:sed [-nefri] ‘command’ 文本名称

(2)^表示行首

(3)//表示使用/对字符/进行转义

(4)g代表将每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了;

2、但是我在执行过上述命令后,只是进行了屏幕输出,于是换成vim进行修改:

       使用vim test.txt打开文件后,使用冒号(:)输入命令:%s/^///finetune_caviar//&/g

       注:因为在文本编辑模式里不需要使用sed命令,也不需要指明文件名称,自然表示命令的' '也是不需要的了。如果不加上%,则只对第一行进行替换。

3、将行首内容/finetune_caviar/替换为finetune:

      shell脚本:sed “s///finetune_caviar/////finetune///” test.txt > test_new.txt (此时不止进行了屏幕输出,同时保存了更新过的文件为test_new.txt)

      vim编辑:%s///finetune_caviar/////finetune/// ,或者g///finetune_caviar///s////finetune///

4、附sed的常用命令:

常用选项:        -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。        -e∶直接在指令列模式上进行 sed 的动作编辑;        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)        -i∶直接修改读取的档案内容,而不是由萤幕输出。       

常用命令:        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

举例:(假设我们有一文件名为ab)     (1)删除某行     [root@localhost ruby]# sed '1d' ab              #删除第一行      [root@localhost ruby] # sed '$d' ab              #删除最后一行     [root@localhost ruby] # sed '1,2d' ab           #删除第一行到第二行     [root@localhost ruby] # sed '2,$d' ab           #删除第二行到最后一行

 (2)显示某行.    [root@localhost ruby]# sed -n '1p' ab           #显示第一行      [root@localhost ruby] # sed -n '$p' ab           #显示最后一行     [root@localhost ruby] # sed -n '1,2p' ab        #显示第一行到第二行     [root@localhost ruby] # sed -n '2,$p' ab        #显示第二行到最后一行

 (3)使用模式进行查询     [root@localhost ruby] # sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行     [root@localhost ruby] # sed -n '//$/p' ab        #查询包括关键字$所在所有行,使用反斜线/屏蔽特殊含义

 (4)增加一行或多行字符串     [root@localhost ruby]# cat ab     Hello!     ruby is me,welcome to my blog.     end     [root@localhost ruby] # sed '1a drink tea' ab  #第一行后增加字符串"drink tea"     Hello!     drink tea     ruby is me,welcome to my blog.      end     [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"     Hello!     drink tea     ruby is me,welcome to my blog.     drink tea     end     drink tea     [root@localhost ruby] # sed '1a drink tea/nor coffee' ab  #第一行后增加多行,使用换行符/n     Hello!     drink tea     or coffee     ruby is me,welcome to my blog.     end

 (5)代替一行或多行     [root@localhost ruby] # sed '1c Hi' ab               #第一行代替为Hi     Hi     ruby is me,welcome to my blog.     end     [root@localhost ruby] # sed '1,2c Hi' ab            #第一行到第二行代替为Hi     Hi     end

     sed 's/^/添加的头部&/g'   //在所有行首添加     sed 's/$/&添加的尾部/g'    //在所有行末添加     sed '2s/原字符串/替换字符串/g'    //替换第2行     sed '$s/原字符串/替换字符串/g'    //替换最后一行     sed '2,5s/原字符串/替换字符串/g'    //替换2到5行     sed '2,$s/原字符串/替换字符串/g'    //替换2到最后一行

     sed '.,$s/原字符串/替换字符串/g'    //替换当前行到最后一行

 (6)替换一行中的某部分  格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式,末尾加g替换每一个匹配的关键字,否则只替换每行的第一个)     sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird  sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby

     替换样式可以多个在同一条命令中执行,用分号”;”分隔:

     sed 's/^/添加的头部&/g;s/$/&添加的尾部/g'    //同时执行两个替换规则

     (7)插入    sed -i '$a bye' ab        #在文件ab中最后一行直接输入"bye"    sed -i '1i'$first ab#在文件ab中第一行插入变量$first作为一行,这里注意1和i之间可以有空格,但是$first前不能有空格

     (8)删除匹配行

      sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)

     (9) 替换匹配行中的某个字符串:

      sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

     (10)sed处理过的输出是直接输出到屏幕上的,要保存可以将输出重定向,或者使用参数”i”直接在文件中替换:

      sed -i 's/原字符串/替换字符串/g' filename    //替换文件中的所有匹配项

      注:为了避免/的歧义。可以使用?、#、+等其他字符来代替/作为命令的分隔符。

5、附vim常用命令

光标控制命令 

  命令                  移动                   向上移一行                    向下移一行                  向左移一个字符                    向右移一个字符   gg              移到文件的首行                   移到文件的末行                   移到屏幕的第一行                   移到下一个字的开头                  移到下一个字的开头,忽略标点符号                   移到下一个字的结尾                  移到下一个字的结尾,忽略标点符号                  移到当前行首                  移到当前行尾                    移到上一段开头                    移到上一段结尾   Enter          移到下一行行首在 vim 中添加文本   命令                  插入                    在光标前插入文本                    在当前行首插入文本                   在光标后插入文本                  在当前行末插入文本                   在当前行的下边插入新行                  在当前行的上边插入新行                    删除光标所在处字符,并进入插入模式                   删除光标所在的行,并进入插入模式   :r filename       读入指定文件内容,并插在当前行后   :nrfile                读入文件 file 内容,并插在第 n 行后   Esc                  回到命令模式在 vim 中删除文本    命令                  删除                     删除光标处的字符    db               删除光标前面的字    dw               删至下一个字的开头    dd               删除整行    :n,md          从第 m 行开始往前删除 n 行    d$                从光标处删除到行尾    d^                从光标处删除到行首在 vim 中查找与替换    命令                 查找与替换  /target             在文件中向前查找 target  ?target            在文件中向后查找 target                      查找下一个                      查找上一个  :setic               查找时忽略大小写  :setnoic          查找时对大小写敏感%s/text1/text2/g       在整个文件中查找text1并且替换为text2在 vim 中复制文本    命令                     复制    yy                复制当前行    nyy              从当前开始复制n行                      粘贴至光标前                      粘贴至光标后                      撤消上一次修改                      撤消所有修改保存与退出vim    命令                     保存或退出    :w                  保存文件但不退出    :wfile             将修改保存在 file 中但不退出  :wq 或 ZZ或:x        保存文件并退出    :q!                 不保存文件,强制退出    :e!                  放弃所有修改,从上次保存文件开始再编辑其他选项    选项                     作用    :setall            查看所有选项    :setnu            设置行号    :setshowmode       显示是输入模式还是替换模式    :set ts=4                 为文本输入设置 tab stops    :setnonumber        取消显示行数    :.=                 查看当前行的行号    :=                  查看总行数    ctrl+g            显示文件名、当前的行号、文件的总行数和文件位置的百分比

    参考:http://www.jb51.net/linuxjishu/155122.html

                http://blog.sina.com.cn/s/blog_4ce89f200100vkb5.html

                http://www.cnblogs.com/afant/archive/2009/03/11/1408745.html


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表