`
天梯梦
  • 浏览: 13640423 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

sed很强大的文本操作命令

 
阅读更多

sed对文本的处理很强大,并且sed非常小,参数少,容易掌握,他的操作方式根awk有点像。sed按顺序逐行读取文件。然后,它执行为 该行指定的所有操作,并在完成请求的修改之后的内容显示出来,也可以存放到文件中。完成了一行上的所有操作之后,它读取文件的下一行,然后重复该过程直到 它完成该文件。在这里要注意一点,源文件(默认地)保持不被修改。sed 默认读取整个文件并对其中的每一行进行修改。说白了就是一行一行的操作。我用sed主要就是用里面的替换功能,真的很强大。下面以实例,详细的说一下,先 从替换开始,最常用的。

 

一,测试文件test,讲awk时用的一样

 

sed -h
-n, --quiet, --silent    取消自动打印模式空间
 -e 脚本, --expression=脚本   添加“脚本”到程序的运行列表
 -f 脚本文件, --file=脚本文件  添加“脚本文件”到程序的运行列表
 --follow-symlinks    直接修改文件时跟随软链接
 -i[扩展名], --in-place[=扩展名]    直接修改文件(如果指定扩展名就备份文件)
 -l N, --line-length=N   指定“l”命令的换行期望长度
 --posix  关闭所有 GNU 扩展
 -r, --regexp-extended  在脚本中使用扩展正则表达式
 -s, --separate  将输入文件视为各个独立的文件而不是一个长的连续输入
 -u, --unbuffered  从输入文件读取最少的数据,更频繁的刷新输出
 --help     打印帮助并退出
 --version  输出版本信息并退出

//下面test文件的内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po
  

 

二,举例

1,替换功能

[zhangy@BlackGhost mytest]# sed 's/root/tankzhang/' test |grep tank
 tankzhang:x:0:0:root:/root:/bin/bash
 

上面的这个例子,把test文件中的root替换成tankzhang,只不过只替换一次及终止在这一行的操作,转到下一行

[zhangy@BlackGhost mytest]# sed 's/root/tankzhang/g' test |grep zhang
 tankzhang:x:0:0:tankzhang:/tankzhang:/bin/bash
 zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
 ba:x:1002:1002::/home/zhangy:/bin/bash
 @zhangying:*:1004:1004::/home/test:/bin/bash
 

上面这个例子,用tankzhang把文件test中的root全部替换掉,请注意g这个字母,global的缩写

[zhangy@BlackGhost mytest]# sed -n 's/root/tankzhang/p' test
 tankzhang:x:0:0:root:/root:/bin/bash
 

加了-n p后表示只打印那些发生替换的行(部分替换),上面的例子,我并没有加上grep

[zhangy@BlackGhost mytest]# sed -n 's/root/tankzhang/pg' test
 tankzhang:x:0:0:tankzhang:/tankzhang:/bin/bash
 

加了-n pg后表示只打印那些发生替换的行(全部替换),上面的例子,我并没有加上grep

[zhangy@BlackGhost mytest]# cat test | sed -ne '2,8s/^zhang/ying/gp'
 yingy:x:1000:100:,,,:/home/zhangy:/bin/bash
 

在第二行,到第八行之间,替换以zhang开头的行,用ying来替换,并显示替换的行

[zhangy@BlackGhost mytest]# cat test | sed -n  '2,8s/^zhang/ying/gp;5,10s#dbus#goodbay#gp'
 yingy:x:1000:100:,,,:/home/zhangy:/bin/bash
 goodbay:x:81:81:System message bus:/:/bin/false
 

当有多个命令要执行时,可以用分号来分开,并且分隔符可以自定义,默认是/。上面的例子意思是在第二行,到第八行之间,替换以zhang开头的行,用ying来替换,在5,到10间,用goodbay来替换dbus,并显示替换的行

[zhangy@BlackGhost mytest]# cat test | sed -ne '2,8s/zhang/ying/gp' -ne  '5,10s#dbus#goodbay#gp'

yingy:x:1000:100:,,,:/home/yingy:/bin/bash
 goodbay:x:81:81:System message bus:/:/bin/false
 

这个例子根上面的那个例子一样,只不过有一点不同,那就是-e来充当了分号的作用,-e也能分割多个命令。

[zhangy@BlackGhost mytest]# sed -ne '2,8s/^\(zhangy\)/\1ing/gp' test
 zhangying:x:1000:100:,,,:/home/zhangy:/bin/bash
 

正则的用法,在sed里面用括号的话要加上\的,不然会报错的。

[zhangy@BlackGhost mytest]# sed -ne '2,15s/zhang/&ying/gp' test
 zhangyingy:x:1000:100:,,,:/home/zhangyingy:/bin/bash
 ba:x:1002:1002::/home/zhangyingy:/bin/bash
 @zhangyingying:*:1004:1004::/home/test:/bin/bash
 

&的用处是,在找到的字符串后加上&后面的字符串,zhang后都加上了ying

[zhangy@BlackGhost mytest]# sed -ne '/^zhang/,/Po/s/zhang/ying/gp' test
 yingy:x:1000:100:,,,:/home/yingy:/bin/bash
 ba:x:1002:1002::/home/yingy:/bin/bash
 @yingying:*:1004:1004::/home/test:/bin/bash
 

上面的这个例子是说,在以zhang开头的行开始,到匹配Po的行结束,在他们之间进行替换

[zhangy@BlackGhost mytest]$ sed  '/root/{n;s/bin/tank/}' test
 root:x:0:0:root:/root:/bin/bash
 tank:x:1:1:bin:/bin:/bin/false
 

n;这里的n是next的缩写,找到root的行后,将其下一行的中的bin换成tank

[zhangy@BlackGhost mytest]$ sed -e '1,2y/root/ROOT/' test
 ROOT:x:0:0:ROOT:/ROOT:/bin/bash
 bin:x:1:1:bin:/bin:/bin/false
 

y的作用是将匹配的字符换成大写,不过替换字符和被替换字符长度要一样

[zhangy@BlackGhost mytest]$ sed -e '/root/h' -e '$G' test

................................

.............................

ba:x:1002:1002::/home/zhangy:/bin/bash
 test:x:1003:1003::/home/test:/bin/bash
 @zhangying:*:1004:1004::/home/test:/bin/bash

root:x:0:0:root:/root:/bin/bash
 

这个例子中,h的作用是将找到的行,放到一个缓存区,G的作用是将缓存区中的内容放到最后一行。

[zhangy@BlackGhost mytest]$ sed -e '/root/h' -e '/zhangy/g' test
 root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/bin/false
 daemon:x:2:2:daemon:/sbin:/bin/false
 mail:x:8:12:mail:/var/spool/mail:/bin/false
 ftp:x:14:11:ftp:/home/ftp:/bin/false
 &nobody:$:99:99:nobody:/:/bin/false
 root:x:0:0:root:/root:/bin/bash
 http:x:33:33::/srv/http:/bin/false
 dbus:x:81:81:System message bus:/:/bin/false
 hal:x:82:82:HAL daemon:/:/bin/false
 mysql:x:89:89::/var/lib/mysql:/bin/false
 aaa:x:1001:1001::/home/aaa:/bin/bash
 root:x:0:0:root:/root:/bin/bash
 test:x:1003:1003::/home/test:/bin/bash
 root:x:0:0:root:/root:/bin/bash
 

行替换,用匹配root的行,来替换匹配zhangy的行

[zhangy@BlackGhost mytest]$ sed -e 's/bin/tank/g;3q' test
 root:x:0:0:root:/root:/tank/bash
 tank:x:1:1:tank:/tank:/tank/false
 daemon:x:2:2:daemon:/stank:/tank/false
 

3q的意思是到第三行的时候,退出

[zhangy@BlackGhost mytest]# sed -ne '2,15s/zhangy.*[[:digit:]]/=======/gp'  test
 =======:,,,:/home/zhangy:/bin/bash
 @=======::/home/test:/bin/bash
 

匹配数字别忘了中括号外面还有一个中括号。

[:alnum:] 字母数字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或制表键
[:cntrl:] 任何控制字符
[:digit:] 数字 [0-9]
[:graph:] 任何可视字符(无空格)
[:lower:] 小写 [a-z]
[:print:] 非控制字符
[:punct:] 标点字符
[:space:] 空格
[:upper:] 大写 [A-Z]
[:xdigit:] 十六进制数字 [0-9 a-f A-F]

 

二,删除

其实我觉得吧,删除其实根替换一样,都是找出来进行一下操作而已,这个过程会牵扯到一些規则而已。

[zhangy@BlackGhost test]$ sed -e '1,14d' test
 @zhangying:*:1004:1004::/home/test:/bin/bash
 policykit:x:102:1005:Po
 

删除1,14行

[zhangy@BlackGhost mytest]$ sed -e '4,$d' test
 root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/bin/false
 daemon:x:2:2:daemon:/sbin:/bin/false
  

删除4以后的行,包括第4行,把$当成最大行数就行了。哈哈

[zhangy@BlackGhost mytest]$ sed -e '/\(false\|bash\)$/d' test
 policykit:x:102:1005:Po
 

删除包括false的行,或者包括bash的行,别忘了加\

[zhangy@BlackGhost mytest]$ sed -e '/root/,/^test/d' test
 @zhangying:*:1004:1004::/home/test:/bin/bash
 policykit:x:102:1005:Po
 

删除从匹配root的行,到匹配以test开头的行,中间的行

 

三,读取,追加,插入文件

[zhangy@BlackGhost mytest]$ sed -e '/^root/r test2' test
 root:x:0:0:root:/root:/bin/bash
 =============
 -------------
 +++++++++++++
 bin:x:1:1:bin:/bin:/bin/false
 daemon:x:2:2:daemon:/sbin:/bin/false
 

读取test2的内容,并将其写入到匹配行的下面

[zhangy@BlackGhost mytest]$ sed '/[[:digit:]]/w test2' test
 

将匹配数字的行,写入test2中

[zhangy@BlackGhost mytest]$ sed  '/root/a\\ ===aaaa====' test
 root:x:0:0:root:/root:/bin/bash
 ===aaaa====
 bin:x:1:1:bin:/bin:/bin/false
 

将要插入的东西,插入匹配行的下面,

[zhangy@BlackGhost mytest]$ sed '/^daemon/i\\=================' test
 root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/bin/false
 =================
 daemon:x:2:2:daemon:/sbin:/bin/false
 mail:x:8:12:mail:/var/spool/mail:/bin/false
 

正好根a相反,将要插入的东西,插入到匹配行的上面

 

四,调用命令文件

[zhangy@BlackGhost mytest]$ sed  -f cmd test |awk '{print $0;}'
 tank:x:0:0:tank:/tank:/tank/bash
 tank:x:1:1:tank:/tank:/tank/false
 ba:x:1002:1002::/home/zhangy:/tank/bash
 test:x:1003:1003::/home/test:/tank/bash
 @zhangying:*:1004:1004::/home/test:/tank/bash
 

cmd是个文件,内容如下

3,12d
s/root/tank/g

 

转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/shell/986.html
分享到:
评论

相关推荐

    sed命令使用

    sed可依照script的指令,来处理、编辑文本文件。 Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。 语法 sed [-hnV][-e[removed]][-f[removed]][文本文件] 参数说明: -e[removed]或-...

    Linux-02sed.ppt

    sed命令的常用操作:主要介绍sed命令的注释方法,打印文本,替换文本,删除文本,追加文本,插入文本,移到下一行,读写文件以及多行模式等。 组合命令:主要介绍如何在sed中组合多条命令以及如何将多条命令应用到一...

    sed命令 处理编辑文本文件

    Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法格式:sed [参数] 常用参数: -e或–...

    sed命令调研文档(PDF)

    因而,它流经文本就如同水流经溪流一样,因而 sed 恰当地代表了流编辑器。它可以用来将所有出现的 "Mr. Smyth" 修改为 "Mr. Smith",或将 "tiger cub" 修改为 "wolf cub"。流编辑器非常适合于执行重复的编辑,这种...

    linux sed命令详解(推荐)

    sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作。sed是按行来处理文本内容的。在shell中,使用sed来批量修改文本内容是非常方便的。 sed命令的选项 sed [选项] [动作] 选项与参数...

    SED1330/SED1335液晶控制器的应用

    2. SED1330在接口单元设置了适配8080系列和M6800系列MPU的操作时序电路,通过引脚的电平设置,可二者选择其一。 ---- 控制单元由振荡器、功能逻辑电路、显示RAM管理电路、字符库及其管理电路和产生驱动时序的时序...

    Linux sed 命令用法详解

    sed 可依照脚本的指令来处理、编辑文本文件。 Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法 sed [-hnV][-e][-f][文本文件] 参数说明: -e或–expression= 以选项中指定的...

    sed(windows)

    小工具,文本操作比较方便。命令也很简单,不会的话随便网上找找一堆。

    一天一个shell命令 linux文本内容操作系列-sed命令详解

    主要介绍了一天一个shell命令 linux文本内容操作系列-sed命令详解,需要的朋友可以参考下

    linux脚本编程中的sed详解

    linux脚本编程中的sed详解,具体解释了linux中的sed命令的用法,例如可以对指定文本中的指定字符串进行替换等操作!

    实战基本的Linux sed命令示例代码

    它使您能够使用Linux sed命令在操作系统中执行文本文件操作。 与大多数Linux应用程序一样,sed可以处理管道输入,这使它成为一种有效的脚本工具。您可以将其用作基本的查找和替换工具,如下面的示例命令所示,该命令...

    linux中sed命令的使用与注意小结

    sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),接着用sed命令处理缓冲区中的...

    sed找到关键字所在行并将其前面的第一个字符删除的命令

    sed找到关键字所在行并将其前面的第一个字符... 您可能感兴趣的文章:查看某时间段到现在的系统日志的sed命令linux之sed命令的用法一天一个shell命令 linux文本内容操作系列-sed命令详解linux中sed命令的使用与注意小结

    stream-editor:一种Web工具,用于交互式使用和链接sed,grep和awk等命令行文本操作实用程序

    Stream Editor是一个Web工具,用于交互式使用和链接命令行文本操作实用程序,例如sed , grep和awk 。 Unix操作系统提供的文本转换工具在模式提取,格式化和数据操作方面具有强大的功能,但是在进行实验和调试时,...

    如何利用sed命令高效删除文件的特定行

    sed 是 Stream Editor 的简写,它用于在 Linux 中进行基本的文本转换,是文件操作的一个重要命令,所以,我们也可以用它来实现文本的删除操作。 下面是一些 sed 命令的使用示例,覆盖了大多数的使用场景,

    sed and awk 101 hacks.pdf (中文版带书签)

    awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。 如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,...

    unix ed编辑器命令详解

    首先要学习的就是文本编辑,而 ed 编辑器是 unix/linux 操作系统下最简单、最典型的文本编辑器,因此,学习 ed 编辑器能够帮助你很好的理解一般的文本操作,而且还可以为你以后学习 unix/linux下的一些常用命令(如 ...

    Linux文本处理

    查找文件内容sed命令sed脚本命令sed s 替换脚本命令sed d 替换脚本命令sed a 和 i 脚本命令sed c 替换脚本命令sed y 转换脚本命令sed p 打印脚本命令sed w 脚本命令sed r 脚本命令sed q 退出脚本命令sed 脚本命令的...

Global site tag (gtag.js) - Google Analytics