找回密码
 骑士注册

QQ登录

微博登录

搜索
❏ 站外平台:

Linux中国开源社区 技术 查看内容

数据流处理命令

2014-04-17 13:20    评论: 11 收藏: 8 分享: 1    

2. sed:流编辑器

stream editor,流编辑器,用程序的方式来编辑文本,正则表达式进行模式匹配。sed本身是一个管道命令,可以分析standard input,也可以将数据进行替换、删除、新增、撷取特定行等功能。

演示文本:catpets.txt

This is my cat
my cat's name is betty
This is my dog
my dog's name is frank
This is my fish
my fish's name is george
This is my goat
my goat's name is adam

使用:sed [-nefr] action

action:-i直接修改读取的档案内容,而不是由屏幕输出,-r表示支持延伸型正则表达式的语法。

动作说明:[n1[,n2]] function n1,n2表示要选择的行数,function包括:

a-新增,c-取代,d-删除,i-插入,p-打印,s-取代(可以直接进行取代的工作,例如 1,20s/old/new/g)

2.1 用s命令进行替换

my字符串替换成Rango Chen’s

sed “s/my/Rango Chen's/g” pets.txt

ps:如果使用单引号,则无法通过\'来转义。该命令并没有对文件内容进行更改,只是把处理过后的内容输出,如果你要写回文件,你可以使用重定向:

sed "s/my/Rango Chen's/g" pets.txt >Chen_pets.txt

,或者使用-i选项:

sed -i “s/my/Rango Chen's/g” pets.txt

s表示替换动作,/g表示一行上的替换所有的匹配。

在每一行最前面加上#:

sed 's/^/#/g' pets.txt        

在每一行的末尾加上---:

sed 's/$/ --- /g' pets.txt    

基础的正则表示法特殊字符:

^ 表示一行的开头。如:/^#/ 以#开头的匹配。
$ 表示一行的结尾。如:/}$/ 以}结尾的匹配。
\< 表示词首。如\<abc 表示以abc 为首的詞。
\> 表示词尾。如 abc\> 表示以abc 結尾的詞。
\  将特殊字符进行转义,还原其本身意义:grep -n  \' pets.txt 搜寻含有单引号'的那一行。
. 表示任何单个字符。
* 表示某个字符出现了0次或多次。
[ ] 字符集合。如:[abc]表示匹配a或b或c,还有[a-zA-Z]表示匹配所有的26个字符。如果其中有^表示取反,如[^a]表示非a的字符
\{n,m\} 连续n到m个的“前一个RE字符” grep -n 'go\{2,3\}g' 1.txt   在g与g之间有2到3个o存在的字符串,亦即(goog)(gooog)

去掉某html中的tags:

html.txt:

   <b>This</b>is what <span style="text-decoration:underline;">I</span> meant.  Understand?
sed 's/<[^>]*>//g' html.txt

只替换第3到第6行的文本:

sed "3,6s/my/your/g" pets.txt

只替换第3行的文本:

sed "3s/my/your/g" pets.txt

只替换每一行的第一个s:

sed 's/s/S/1' my.txt   1表示第一个

只替换每一行的第二个s:

sed 's/s/S/2' my.txt    2表示第二个

只替换第一行的第3个以后的s:

sed 's/s/S/3g' my.txt

2.2 多个匹配

一次替换多个模式,每个模式之间用;进行间隔:

sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt

上面的命令等价于:

sed -e'1,3s/my/your/g' -e '3,$s/This/That/g' my.txt

使用&来当做被匹配的变量,加入一些字符:

sed 's/my/[&]/g' my.txt

此命令相当于在my两边加上[]

2.3 圆括号匹配

圆括号括起来的正则表达式所匹配的字符串会可以当成变量来使用,sed中使用的是\1,\2…

sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' my.txt
cat:betty
dog:frank
fish:george
goat:adam

 

2.4 基本知识点

1)Pattern Space:关于参数-n,表示取消默认输出,相当于--quiet,--silent。在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。

2)Address:[address[,address]][!]{cmd},其中的!表示匹配成功后是否执行命令,address可以是一个数字,也可以是一个模式,可以通过逗号分隔两个address表示两个address的区间。

3)命令打包:cmd可以是多个,它们可以用分号分开,可以用大括号括起来作为嵌套命令

对3行到第6行,匹配/This/成功后,再匹配/fish/,成功后执行d命令:

sed '3,6 {/This/{/fish/d}}' pets.txt

从第一行到最后一行,如果匹配到This,则删除之;如果前面有空格,则去除空格:

sed '1,${/This/d ; s/^ *//g}' pets.txt

4)HoldSpace:保持空间

g:将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
G:将hold space中的内容append到pattern space\n后
h:将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
H:将pattern space中的内容append到hold space\n后
x:交换pattern space和hold space的内容

sed -e '/test/h' -e '$G‘  example:在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

sed -e '/test/h' -e '/check/x' example:互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。

5)执行sed脚本:sed -f test.sed

Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

ps: 去除空白行:sed '/^ *$/d' file

查看其它分页:

最新评论

我也要发表评论

绿色圣光 2014-04-17 13:26 回复
都是常用的命令,不过我一直没能好好学习awk的用法,uniq没用过,其他的用的比较多。
无名的城堡 2014-04-17 14:35  新浪微博网友评论 回复
nuance小窝 2014-04-17 14:35  新浪微博网友评论 回复
Repost
冷面邪恶书生 2014-04-17 15:11  新浪微博网友评论 回复
回复@绿色圣光:uniq 都是结合管道处理日志重复行
绿色圣光 2014-04-17 15:58  新浪微博网友评论 回复
回复@冷面邪恶书生:这样啊,学习一下,以后难免会用到。
拿AK47的耶稣 2014-04-17 17:01  新浪微博网友评论 回复
這个有用
游客 2014-04-17 23:43 回复
赞一下awk
游客 2015-03-02 11:57 回复
真心觉得不错!!
sofuc.com 2015-03-11 06:18 回复
踩一脚。。。
contra_mundi 2015-08-01 16:33 回复
$sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' pets.txt
     This is my cat
    my cat's name is betty
    This is my dog
    my dog's name is frank
    This is my fish
    my fish's name is george
    This is my goat
    my goat's name is adam

不知道我哪里错了,得不到下面的结果
cat:betty
dog:frank
fish:george
goat:adam
a172525630 2015-08-06 15:52 回复
不错哦!

收藏

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。