Skip to content

Instantly share code, notes, and snippets.

@weaming
Forked from zxhfighter/sed.md
Last active January 6, 2016 06:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save weaming/68586d12b08fbfcfe499 to your computer and use it in GitHub Desktop.
Save weaming/68586d12b08fbfcfe499 to your computer and use it in GitHub Desktop.
sed简明教程

sed简明教程

FROM: 酷壳-陈皓

awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了。所以林妹妹跳了个Topless,他的哥哥sed坐不住了,也一定要出来抖一抖。

sed全名叫stream editor,流编辑器,用程序的方式来编辑文本,相当的hacker啊。sed基本上就是玩正则模式匹配,所以,玩sed的人,正则表达式一般都比较强。

同样,本篇文章不会说sed的全部东西,你可以参看sed的手册,我这里主要还是想和大家竞争一下那些从手机指缝间或马桶里流走的时间,用这些时间来学习一些东西。当然,接下来的还是要靠大家自己双手。

用s命令替换

把其中的my字符串替换成Hao Chen’s,下面的语句应该很好理解(s表示替换命令,/my/表示匹配my,/Hao Chen’s/表示把匹配替换成Hao Chen’s,/g表示一行上的替换所有的匹配)

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

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

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

sed "s/my/Hao Chen's/g" pets.txt > pets_new.txt

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

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

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

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

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

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

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

  • ^ 表示一行的开头。如:/^#/ 以#开头的匹配。
  • $ 表示一行的结尾。如:/}$/ 以}结尾的匹配。
  • \< 表示词首。 如 \<abc 表示以 abc 为首的詞。
  • \> 表示词尾。 如 abc\> 表示以 abc 結尾的詞。
  • . 表示任何单个字符。
    • 表示某个字符出现了0次或多次。
  • [] 空格或字符集合。 如:[abc]表示匹配a或b或c,还有[a-zA-Z]表示匹配所有的26个字符。如果其中有^表示反,如[^a]表示非a的字符。

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

如果你这样搞的话,就会有问题:

sed "s/<.*>//g" html.txt

要解决上面的那个问题,就得像下面这样,其中的"[^>]"指定了除了>的字符重复0次或多次。

sed "s/<[^>]*>//g" html.txt

我们再来看看指定需要替换第3行的内容:

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

下面的命令只替换第3到第6行的文本:

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

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

sed "s/s/S/1" my.txt

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

sed "s/s/S/2" my.txt

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

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

多个匹配

如果我们需要一次替换多个模式,可参看下面的示例:(第一个模式把第一行到第三行的my替换成your,第二个则把第3行以后的This替换成了That)。

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

上面的命令等价于:(注:下面使用的是sed的-e命令行参数)

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

我们可以使用&来当做被匹配的变量,然后可以在基本左右加点东西。如下所示:

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

圆括号匹配

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

sed "s/This is my \([^,]*\),.*is \(.*\)/\1:\2/g" my.txt

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

正则为:This is my ([^,]*),.*is (.*)

匹配为:This is my (cat),……….is (betty)

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

sed的命令

d命令:删除匹配行

sed '2,$d' my.txt

p命令:打印命令,类似grep功能

sed -n '1,/fish/p' my.txt


###Following are added by weaming 命令

  • N命令:把下一行的内容纳入当成缓冲区做匹配。
  • a命令和i命令:a命令就是append, i命令就是insert,它们是用来添加行的。
  • c 命令:替换匹配行
  • d命令:删除匹配行
  • p命令:打印命令

Knowledge points

  • Pattern Space
  • -n参数:不输出 pattern space 的内容
  • Address:行数范围,可使用相对位置,比如+3表示后面连续三行
  • 命令打包:可以是多个,它们可以用分号分开,可以用大括号括起来作为嵌套命令
  • Hold Space:
  • 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的内容
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment