欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sed简明用法 博客分类: linux sed

程序员文章站 2024-03-14 22:43:59
...
本文旨在帮助sed新手快速熟悉sed的常见用法。
首先,用如下文件作为源文件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


替换命令s
把文本中所有的my替换为your:(其中s代表替换命令,g代表全行替换)
$cat pets.txt | sed 's/my/your/g' >> pets1.txt


把文本中的第1行my替换为your:
$cat pets.txt | sed '1s/my/your/g' >> pets1.txt


把文本中的第1~3行my替换为your:
$cat pets.txt | sed '1,3s/my/your/g' >> pets1.txt


替换每一行的第1个my
$cat pets.txt | sed 's/my/your/1' >> pets1.txt


替换每一行的第2个my
$cat pets.txt | sed 's/my/your/2' >> pets1.txt


替换每一行的第3个my以及之后的
$cat pets.txt | sed 's/my/your/3g' >> pets1.txt



在pets1.txt的每一行的开头加上#
cat pets1.txt | sed 's/^/#/g' >> pets2.txt


在pets2.txt的每一行的结尾加上----
cat pets2.txt | sed 's/$/----/g' >> pets3.txt


在上面的两个例子中,^代表每行的开头,$代表每行的结尾,顺便说下正则表达式的一些最基本的东西:

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


正则表达式是很牛逼的,比如test.html:
<b>This</b> is what <span style="text-decoration: underline;">I</span> meant.

要去掉其中的标签:(其中[^>]*表示0个或者多个非>字符)
cat test.html | sed 's/<[^>]*>//g'


预取命令N

将文本pets.txt的偶数行加到奇数行后面:
cat pets.txt | sed 'N; s/\n/,/g' >> mypets.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中使用的是\1,\2…)
比如:
cat mypets.txt | sed 's/This is my \([^,]*\),  my .* \(.*\)/\1:\2/g'

结果如下:
cat:betty
dog:frank
fish:george
goat:adam

关于这条命令需要介绍一下,[^,]*表示0个或者多个非逗号字符,.*表示0个或多个任意字符。用括号来表示括号匹配,需要用转义字符\


插入命令i和a
以mypets.txt为例,在第一行之前插入一行:
cat mypets.txt | sed "1i This is my pig,  my pig's name is bajie"


以mypets.txt为例,在第一行之后插入一行:
cat mypets.txt | sed "1a This is my pig,  my pig's name is bajie"


我们可以运用匹配来添加文本,再dog后面插入一行:
cat mypets.txt | sed "/dog/a This is my pig,  my pig's name is bajie"


整行替换命令c
以mypets.txt为例,将第二行替换:
cat mypets.txt | sed "2c This is my pig,  my pig's name is bajie"


将dog所在行替换
cat mypets.txt | sed "/dog/c This is my pig,  my pig's name is bajie"


整行删除命令c

以mypets.txt为例,将第二行删除:
cat mypets.txt | sed '2d'


以mypets.txt为例,将dog所在行替换:
cat mypets.txt | sed '/dog/d'


以mypets.txt为例,将第二行以及以后所有行删除:
cat mypets.txt | sed '2,$d'


整行打印命令p

找出/etc/passwd中包含root的行:
cat /etc/passwd | sed -n '/root/p'
上面的命令等价于
grep 'root' /etc/passwd


另外补充一点,覆盖原来的文件使用 -i,例子:
$cat pets.txt | sed 's/my/your/g' >> pets1.txt

覆盖原来的文件的写法为:
sed -i 's/my/your/g' pets.txt


以上内容转发整理自http://coolshell.cn/articles/9104.html#more-9104

grep,sed,awk并成为linux三剑客,他们三个正好是一套处理字符的流程,grep用于查找目标字符,sed用于编辑字符,awk用于选择和分析字符。



相关标签: sed