sed command file
#我们先来看看原文件的内容 [roc@roclinux ~]$ cat roc.txt test 1 test2 testtest XtestX BBtest #我们想用sed命令来删除文件中带字符“2”的行 [roc@roclinux ~]$ sed '/2/d' roc.txt test 1 testtest XtestX BBtest
/2/d
,而且它是用单引号括起来的。你也一定要学着这样做,用到 sed,别忘了用单引号将 command 部分括起来。/2/d
中的 d 表示删除,意思是说,只要某行内容中含有字符 2,就删掉这一行。(sed 所谓的删除都是在模式空间中执行的,不会真正改动 roc.txt 原文件。)
#先来一起看看/etc/passwd文件的内容 [roc@roclinux ~]$ head -n 5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #我们这回用sed命令来提取文件中每行的第一个域, 间隔符是冒号 [roc@roclinux ~]$ head -n 5 /etc/passwd|sed 's/:.*$//' root bin daemon adm lp
's/:.*$//'
,表示我们要把每一行的第一个冒号到结尾的部分都清空,这样留下的便是第一个冒号前的内容啦。
-n
选项,想把这个选项介绍清楚,还是要费一些脑子和笔墨的。#还是先来看看原文件的内容 [roc@roclinux ~]$ cat roc.txt 1 2 3 4 5 #仔细看, 输出中出现了两个“4” [roc@roclinux ~]$ sed ‘/4/p’ roc.txt 1 2 3 4 4 5看,所有的原始文件内容都被输出来了,而且含有字符4的行被输出了两遍。
-n
选项试一试,你会发现,结果变得如你所愿了。
[roc@roclinux ~]$ sed -n '/4/p' roc.txt 4
-n
选项会很严肃地警告 sed 命令:除非是明确表明要输出的行,否则不要给我胡乱输出。-n
选项经常和 p 配合使用,其含义就是,输出那些匹配的行。
$ sed command file其中,command 部分是 sed 命令的精髓,对 command 部分的掌握程度决定了你是不是 sed 高手。
#我们采用了刚才提到的指定行区间的方法 [roc@roclinux ~]$ sed -n '10,20p' test
[roc@roclinux ~]$ sed '/^[dD]/s/x/X/g' test
#点号表示一个单个字符, 两个点号就表示两个单个字符 [roc@roclinux ~]$ sed 's/..$//' test
'/..$/d'
表示的是匹配所有末尾含有两个字符的行,然后删除这一整行内容,显然这和我们的初衷是相悖的。[roc@roclinux ~]$ sed 's/..//' test
#按照惯例, 先展示文件的内容 [roc@roclinux ~]$ cat mysed.txt Beijing London #我们使用到了&符号, 大家试着猜一猜它的作用 [roc@roclinux ~]$ sed 's/B.*/&2008/' mysed.txt Beijing2008 London
#这个例子或许更易理解 [roc@roclinux 20160229]$ sed 's/Bei/&2008/' mysed.txt Bei2008jing London
[roc@roclinux ~]$ echo "hello world" | sed 's/\(hello\).*/world \1/' world hello我们看到,原本是“hello world”,经过 sed 的处理,输出变成了“world hello”。
#先看下文件内容, 第一行中出现了4个Beijing [roc@roclinux ~]$ cat mysed.txt Beijing Beijing Beijing Beijing London London London London #效果实现啦, 可是, 命令真的好复杂 [roc@roclinux ~]$ sed 's/\(Beijing\)\(.*\)\(Beijing\)/\12008\2\32008/' mysed.txt Beijing2008 Beijing Beijing Beijing2008 London London London London
\1
和\3
,我们在其后面追加了 2008 这个字符串。
#文件内容展示一下 [roc@roclinux ~]$ cat mysed.txt Beijing 2003 Beijing 2004 Beijing 2005 Beijing 2006 Beijing 2007 Beijing 2008 Beijing 2007 #我们想展示匹配了2005的行和2007的行之间的内容 [roc@roclinux ~]$ sed -n ‘/2005/,/2007/p’ mysed.txt Beijing 2005 Beijing 2006 Beijing 2007
#我们通过2个-e选项设置了两个command [roc@roclinux ~]$ sed -n -e ‘1,2p’ -e ‘4p’ mysed.txt Beijing 2003 Beijing 2004 Beijing 2006
-e
选项的后面要立即接 command 内容,不允许再夹杂其他选项。-e
选项支持设置多个 command,这原本是一件好事情,让我们可以更方便地实现一些替换效果。但是,这也给我们带来了幸福的烦恼,假如我们设定了很多个 command,那它们的执行顺序是怎样的呢?-e
选项带来的或许只有混乱而非便捷。我们来一起看看下面的例子:
#先看看文件的内容 [roc@roclinux ~]$ cat mysed.txt Beijing 2003 Beijing 2004 Beijing 2005 Beijing 2006 Beijing 2007 Beijing 2008 #我们设置了两个command [roc@roclinux ~]$ sed -e ‘s/Beijing/London/g’ -e ‘/Beijing/d’ mysed.txt London 2003 London 2004 London 2005 London 2006 London 2007 London 2008
#我们先指定删除动作, 再指定替换动作 [roc@roclinux 20160229]$ sed -e '/Beijing/d' -e 's/Beijing/London/g' mysed.txt [roc@roclinux 20160229]$
-f
选项来指定这个文件作为我们 sed 命令的 command 部分:
#这是我们事先写好的文件 [roc@roclinux ~]$ cat callsed /2004/,/2006/p #我们用-f选项来指定command文件 [roc@roclinux ~]$ sed -n -f callsed mysed.txt Beijing 2004 Beijing 2005 Beijing 2006
-f
选项并不难,而且我会经常使用,因为一些比较常用的匹配规则,我都会存到单独的文件中,不用再费脑子记忆啦。
#我们将要插入的内容保存到一个单独的文件中 [roc@roclinux ~]$ cat ins.txt ====China==== #展示一下我们要处理的文件 [roc@roclinux ~]$ cat mysed.txt Beijing 2003 Beijing 2004 Beijing 2005 Beijing 2006 Beijing 2007 Beijing 2008 #看, 我们使用r来实现插入 [roc@roclinux ~]$ sed ‘/2005/r ins.txt’ mysed.txt Beijing 2003 Beijing 2004 Beijing 2005 ====China==== Beijing 2006 Beijing 2007 Beijing 2008通过效果可以看出来,我们在文件中的含有 2005 字符串的行的下面一行插入了 ins.txt 文件的内容。
#文件内容 [roc@roclinux ~]$ cat new.txt Beijing 2004 Beijing 2005 Beijing 2006 #我们希望在2004的下一行插入China [roc@roclinux ~]$ sed ‘/2004/a\China’ mysed.txt Beijing 2003 Beijing 2004 China Beijing 2005 Beijing 2006 Beijing 2007 Beijing 2008可以看到,我们只要使用
a\
然后加上要插入的内容就可以轻松实现啦。i\
动作:
[roc@roclinux ~]$ sed ‘/2004/i\China’ mysed.txt Beijing 2003 China Beijing 2004 Beijing 2005 Beijing 2006 Beijing 2007 Beijing 2008
#原文件内容 [roc@roclinux ~]$ cat mysed.txt Beijing 2003 Beijing 2004 Beijing 2005 Beijing 2006 Beijing 2007 Beijing 2008 #y就是按照字符顺序, 实现前后的替换 [roc@roclinux 20160229]$ sed 'y/ei/ie/' mysed.txt Biejeng 2003 Biejeng 2004 Biejeng 2005 Biejeng 2006 Biejeng 2007 Biejeng 2008这个例子其实已经很清楚了,我们希望将所有的 e 和 i 互换。
y///
和s///
有什么区别呢?主要有以下两点:
[roc@roclinux 20160229]$ sed 'y/ee/ie/' mysed.txt Biijing 2003 Biijing 2004 Biijing 2005 Biijing 2006 Biijing 2007 Biijing 2008
#原文件内容 [roc@roclinux ~]$ cat mysed.txt Beijing 2003 Beijing 2004 Beijing 2005 Beijing 2006 Beijing 2007 Beijing 2008 #iji到iba的替换中, 只有j到b起到了效果 [roc@roclinux 20160229]$ sed 'y/iji/iba/' mysed.txt Beibing 2003 Beibing 2004 Beibing 2005 Beibing 2006 Beibing 2007 Beibing 2008
#原文件内容 [roc@roclinux ~]$ cat mysed.txt Beijing 2003 Beijing 2004 Beijing 2005 Beijing 2006 Beijing 2007 Beijing 2008 #我们同时使用了n动作和y动作 [roc@roclinux ~]$ sed ‘/200/{n;y/eijng/EIJNG/;}’ mysed.txt Beijing 2003 BEIJING 2004 Beijing 2005 BEIJING 2006 Beijing 2007 BEIJING 2008
n
选项在起作用,它的真实作用是将下一行内容放到处理缓存中,这样,就让当前这一行躲避开了替换动作,是不是有点像小时候玩游戏时通过左右键躲避开 BOSS 的大招,哈哈。
#将包含2004、2005、2006的行保存到new.txt文件中 [roc@roclinux ~]$ sed ‘/200[4-6]/w new.txt’ mysed.txt Beijing 2003 Beijing 2004 Beijing 2005 Beijing 2006 Beijing 2007 Beijing 2008 #我们要的内容已经乖乖到碗里来了 [roc@roclinux ~]$ cat new.txt Beijing 2004 Beijing 2005 Beijing 2006
本文链接:http://task.lmcjl.com/news/16635.html