sed命令
sed命令
赵王军 发表于3年前
sed命令
  • 发表于 3年前
  • 阅读 14
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 学习shell编程,sed这种利器是绝对不能少的,这里简单的介绍下sed的一些常用方法

简介

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空 间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入 文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件

定址

定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。
如果地址是数字这表示行号,两个地址直接的连接用','来实现。如果是“$"则表示最后一行,例如:

#打印第三行
sed -n '3p' example
 
#查看文件的10到30行
sed -n '10,30p' example
 
#从第10行查看到末尾
sed -n '10,$' example
 
#打印从包含“first”的行 到包含“python”的行
sed -n '/first/,/python/p' example
 
#删除包含“linux”的行到第10行
sed '/linux/,10d'  example 
 
#删除example文件所有包含test的行 
sed '/test/'d example

常用命令

s命令替换

我使用下面的这段文本做演示:

$catpets.txt
This is mycat
  mycat'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

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

1

2

3

4

5

6

7

8

9

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

This is Hao Chen'scat

  Hao Chen's cat's name is betty

This is Hao Chen's dog

  Hao Chen's dog's name is frank

This is Hao Chen's fish

  Hao Chen's fish's name is george

This is Hao Chen's goat

  Hao Chen's goat's name is adam

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

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

1

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

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

1

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

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

1

2

3

4

5

6

7

8

9

$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

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

1

2

3

4

5

6

7

8

9

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

This is mycat---

  mycat'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 ---

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

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

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

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

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

  • . 表示任何单个字符。

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

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

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

html.txt

1

<b>This</b> is what <spanstyle="text-decoration: underline;">I</span> meant. Understand?

看看我们的sed命令

1

2

3

4

5

6

7

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

$ sed's/<.*>//g' html.txt

 Understand?

# 要解决上面的那个问题,就得像下面这样。

# 其中的'[^>]' 指定了除了>的字符重复0次或多次。

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

This is what I meant. Understand?

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

1

2

3

4

5

6

7

8

9

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

This is mycat

  mycat's name is betty

This is your 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

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

1

2

3

4

5

6

7

8

9

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

This is mycat

  mycat's name is betty

This is your dog

  your dog's name is frank

This is your fish

  your fish's name is george

This is my goat

  my goat's name is adam

 

1

2

3

4

5

$catmy.txt

This is mycat, mycat'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:

1

2

3

4

5

$sed' s/s/S/1' my.txt

ThiS is mycat, mycat'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:

1

2

3

4

5

$sed 's/s/S/2' my.txt

This iS mycat, mycat'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

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

1

2

3

4

5

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

This is mycat, mycat'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

c命令

c 命令是替换匹配行

1

2

3

4

5

6

7

8

9

10

11

$sed"2 c This is my monkey, my monkey's name is wukong"my.txt

This is mycat, mycat's name is betty

This is my monkey, my monkey's name is wukong

This is my fish, my fish's name is george

This is my goat, my goat's name is adam

 

$sed"/fish/c This is my monkey, my monkey's name is wukong"my.txt

This is mycat, mycat's name is betty

This is my dog, my dog's name is frank

This is my monkey, my monkey's name is wukong

This is my goat, my goat's name is adam

d命令

删除匹配行

1

2

3

4

5

6

7

8

9

10

11

12

$sed'/fish/d'my.txt

This is mycat, mycat's name is betty

This is my dog, my dog's name is frank

This is my goat, my goat's name is adam

 

$sed'2d'my.txt

This is mycat, mycat's name is betty

This is my fish, my fish's name is george

This is my goat, my goat's name is adam

 

$sed'2,$d'my.txt

This is mycat, mycat's name is betty

a命令和i命令

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# 其中的1i表明,其要在第1行前插入一行(insert)

$sed"1 i This is my monkey, my monkey's name is wukong"my.txt

This is my monkey, my monkey's name is wukong

This is mycat, mycat'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

 

# 其中的1a表明,其要在最后一行后追加一行(append)

$sed"$ a This is my monkey, my monkey's name is wukong"my.txt

This is mycat, mycat's name is betty

This is my monkey, my monkey's name is wukong

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

4

5

6

7

# 注意其中的/fish/a,这意思是匹配到/fish/后就追加一行

$sed"/fish/a This is my monkey, my monkey's name is wukong"my.txt

This is mycat, mycat'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 monkey, my monkey's name is wukong

This is my goat, my goat's name is adam

下面这个例子是对每一行都挺插入:

1

2

3

4

5

6

7

8

9

$sed"/my/a ----"my.txt

This is mycat, mycat'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

----


共有 人打赏支持
粉丝 6
博文 40
码字总数 18401
×
赵王军
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: