Linux sed命令简介

来源:互联网 发布:js如何获取input的值 编辑:程序博客网 时间:2024/06/08 03:01

        sed(意为流编辑器,源自英语“stream editor”的缩写)是Unix常见的命令行程序。sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出。sed通常用来匹配一个或多个正则表达式的文本进行处理。

常用的sed命令

sed /模式/p filename- 打印出所有匹配“模式”的行

sed /模式/d filename- 删除所有匹配“模式”的行

s- 替换字符串

sed s/模式/替换文字/filename-将匹配“模式”的行转换成“替换文字”

s命令预设只替换每行匹配的第一串文字,也就是说,若每行里有多个匹配该模式的字符串,后面的将不会被s转换。在这个情况可以g命令来替换所有匹配的文字,如下:

sed ‘s/模式/替换文字/g’ filename将所有匹配模式的字符串转换成替换文字

命令行选项

-f- 按照指定的sed脚本里面的命令来进行转换

-i- 表示将转换结果直接插入文件中(若不用-i,一般sed命令不会改变原文档里的内容,而只会输出到命令行。当然命令行输出的内容也可以用“>”转存到另外一个文件里。)

-e- 表示在e后面的文字是正则表达式。有的版本不需要加注e选项也同样可以在命令中使用正则表达式。

s命令替换

$ cat pets.txt This is my cat  my cat's name is bettyThis is my dog  my dog's name is frankThis is my fish  my fish's name is georgeThis is my goat  my goat's name is adam

下面把其中的my字符串替换成Chen’s,

s表示替换命令,/my/表示匹配my,/ Chen’s/表示把匹配替换成Chen’s,/g 表示一行上的替换所有的匹配


$ sed "s/my/Chen's/g" pets.txt This is Chen's cat  Chen's cat's name is bettyThis is Chen's dog  Chen's dog's name is frankThis is Chen's fish  Chen's fish's name is georgeThis is Chen's goat  Chen's goat's name is adam

注意:如果要使用单引号,那么你没办法通过\’这样来转义,用双引号就可以了。

再注意:上面的sed并没有对文件的内容改变,只是把处理过后的内容输出到屏幕,并没有写回原文件。如果要写回文件,可以使用重定向,如:

</pre><pre name="code" class="cpp">$ sed "s/my/Hao Chen's/g" pets.txt > hao_pets.txt

或使用 -i 参数直接修改文件内容:

$ sed -i "s/my/Hao Chen's/g" pets.txt

在每一行最前面加点东西:

$ sed 's/^/#/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

在每一行最后面加点东西:


$ sed 's/$/ --- /g' pets.txtThis 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 ---

顺手介绍一下正则表达式的一些最基本的东西:

1.        ^ 表示一行的开头。如:/^#/以#开头的匹配。

2.        $ 表示一行的结尾。如:/}$/以}结尾的匹配。

3.        \< 表示词首。 如 \<abc 表示以 abc 为首的詞。

4.        \> 表示词尾。 如 abc\> 表示以 abc 結尾的詞。

5.        . 表示任何单个字符。

6.        *表示某个字符出现了0次或多次。

7.        [ ] 字符集合。 如:[abc]表示匹配a或b或c,还有[a-zA-Z]表示匹配所有的26个字符。如果其中有^表示反,如[^a]表示非a的字符

正规则表达式是一些很牛的事,比如我们要去掉某html中的标签:

html.txt<b>This</b> is what <span style="text-decoration: underline;">I</span> meant. Understand?# 如果你这样搞的话,就会有问题$ sed 's/<.*>//g' html.txt Understand? # 要解决上面的那个问题,就得像下面这样。# 其中的'[^>]' 指定了除了>的字符重复0次或多次。$ sed 's/<[^>]*>//g' html.txtThis is what I meant. Understand?

替换指定行的内容:

$ sed "3s/my/your/g" pets.txtThis is my cat  my cat's name is bettyThis is your dog  my dog's name is frankThis is my fish  my fish's name is georgeThis is my goat  my goat's name is adam

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

$ sed "3,6s/my/your/g" pets.txtThis is my cat  my cat's name is bettyThis is your dog  your dog's name is frankThis is your fish  your fish's name is georgeThis is my goat  my goat's name is adam

看另一个文本:

$ cat my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam

指定替换一行的第几个:

$ sed 's/s/S/2' my.txtThis iS my cat, my cat's name is bettyThis iS my dog, my dog's name is frankThis iS my fish, my fish's name is georgeThis iS my goat, my goat's name is adam

2表示替换第二次匹配的s

替换第三个一行的s:

$ sed 's/s/S/3g' my.txtThis is my cat, my cat'S name iS bettyThis is my dog, my dog'S name iS frankThis is my fiSh, my fiSh'S name iS georgeThis is my goat, my goat'S name iS adam

多次匹配

如果我们需要一次替换多个模式,有两种方法:

1.        两次匹配用’;’分开即可

2.        使用sed的-e选项


$ sed '1,3s/my/your/g; 3,$s/This/That/g' my.txtThis is your cat, your cat's name is bettyThis is your dog, your dog's name is frankThat is your fish, your fish's name is georgeThat is my goat, my goat's name is adam$ sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txtThis is your cat, your cat's name is bettyThis is your dog, your dog's name is frankThat is your fish, your fish's name is georgeThat is my goat, my goat's name is adam

第一个模式把第1行到第3行的my替换成your,第二个则把第3行以后的This替换成了That。上面的3,$表示从第3行到最后一行($表示最后一行)。

圆括号匹配

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

$ sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' my.txtcat:bettydog:frankfish:georgegoat:adam

上面这个例子中的正则表达式有点复杂,解开如下(去掉转义字符):

正则为:This is my ([^,]*),.*is (.*)
匹配为:This is my (cat),……….is (betty)

然后:\1就是cat,\2就是betty

sed的命令

让我们回到最一开始的例子pets.txt,让我们来看几个命令:

a命令和i命令

a命令就是append, i命令就是insert,它们是用来添加行的。如:

# 其中的1i表明,其要在第1行前插入一行(insert)$ sed "1 i This is my monkey, my monkey's name is wukong" my.txtThis is my monkey, my monkey's name is wukongThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam # 其中的1a表明,其要在最后一行后追加一行(append)$ sed "$ a This is my monkey, my monkey's name is wukong" my.txtThis is my cat, my cat's name is bettyThis is my monkey, my monkey's name is wukongThis is my dog, my dog's name is frankThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam

c命令

c 命令是替换匹配行

替换第二行

$ sed "2 c This is my monkey, my monkey's name is wukong" my.txtThis is my cat, my cat's name is bettyThis is my monkey, my monkey's name is wukongThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam

替换匹配fish的行

$ sed "/fish/c This is my monkey, my monkey's name is wukong" my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my monkey, my monkey's name is wukongThis is my goat, my goat's name is adam

d命令

删除匹配行

$ sed '/fish/d' my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my goat, my goat's name is adam $ sed '2d' my.txtThis is my cat, my cat's name is bettyThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam $ sed '2,$d' my.txtThis is my cat, my cat's name is betty


p命令

打印命令

你可以把这个命令当成grep式的命令

# 匹配fish并输出,可以看到fish的那一行被打了两遍,# 这是因为sed处理时会把处理的信息输出$ sed '/fish/p' my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my fish, my fish's name is georgeThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam # 使用n参数就好了,表示只打印匹配的那一行或几行到屏幕$ sed -n '/fish/p' my.txtThis is my fish, my fish's name is george # 从一个模式到另一个模式$ sed -n '/dog/,/fish/p' my.txtThis is my dog, my dog's name is frankThis is my fish, my fish's name is george #从第一行打印到匹配fish成功的那一行$ sed -n '1,/fish/p' my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my fish, my fish's name is George

总结:

a:append添加

i:insert插入

c:change替换

d:delete删除

p:print打印


转自酷客网:sed 简明教程。

0 0