sed命令

2019-11-04  本文已影响0人  aq_wzj

原文地址: https://www.jianshu.com/p/89163e927a2c

0. 目录

1.简介
2.子命令
    2.1 p--输出
    2.2 i--插入行
    2.3 a --追加行
    2.4 d删除行
    2.5 c替换行
    2.6 s替换指定文本

  1. 子命令组合

1. 简介

在命令行对文本进行操作, 如替换某文字, 插入文字, 删除文字等

语法格式

sed [options] commands [inputfile...]

commands会包含一些子命令,如p代表打印ia代表插入和追加,d代表删除行c代表替换行s代表替换单词

option包含的一些选项及其作用如下

选项名 作用
-n 取消默认输出
-e 多点编辑,可以执行多个子命令
-f 从脚本文件中读取命令(sed操作可以事先写入脚本,然后通过-f读取并执行)
-i 直接编辑原文件
-l 指定行的长度
-r 在脚本中使用扩展表达式

测试文本
root@wzj-dev:/opt# cat test1.txt

letitia
mail
uuencode
1003605091
01566

sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i选项或者将结果重定向到新的文件中。

以下实验均为缓冲区操作,未改变源文件

2. 子命令

2.1 p--输出

2.1.1 打印1-3行

root@wzj-dev:/opt# sed '1,3 p' test1.txt
letitia
letitia
mail
mail
uuencode
uuencode
1003605091
01566

因为未加-n选项,所以除了打印第1-3行外, 还有个默认打印, 导致第1-3行打印两遍

root@wzj-dev:/opt# sed -n '1,3 p' test1.txt 
letitia
mail
uuencode

2.1.2 正则 --打印ma开头的那一行到最后一行

root@wzj-dev:/opt# sed -n '/^ma/,$ p' test1.txt
mail
uuencode
1003605091
01566

2.1.3 设置步长--- 第一行开始,行号递增2输出

root@wzj-dev:/opt# sed -n '1~2 p' test1.txt
letitia
uuencode
01566

2.2 i--插入行

在第二行前插入一行insert111字符串

#-e选项表示多个子命令,本例执行i子命令之后执行了p子命令
root@wzj-dev:/opt# sed -n -e '2 i insert111' -e '1,4 p' test1.txt 
letitia
insert111
mail
uuencode
1003605091

2.3 a --追加行

在第二行之后追加一行append111字符串

root@wzj-dev:/opt# sed -n -e '2 a append111' -e '1,4 p' test1.txt
letitia
mail
append111
uuencode
1003605091

2.4 d删除行

删除第二行

root@wzj-dev:/opt# sed -n -e '2 d' -e '1,$ p' test1.txt
letitia
uuencode
1003605091
01566

2.5 c替换行

将第二行的mail替换为newmail

root@wzj-dev:/opt# sed -n -e '2 c newmail' -e '1,$ p' test1.txt
letitia
newmail
uuencode
1003605091
01566

2.6 s替换指定文本

2.6.1 语法格式

sed '位置参数 s/pattern/replaced/[flag]'

位置参数: 与前面一样, 可以为'1,$',支持正则,也可以不指定
s: 子命令,代表替换指定文本
pattern: 要替换的文本,支持正则表达式
replaced: 用来替换的一般字符串
flag是替换标志,用来影响匹配替换的规则:
flag 用法
g 全局匹配,会替换文本行中所有匹配的字符串
十进制n 替换文本行中第n个匹配的字符串
p 替换第一个匹配的字符串,并且将缓冲区输出到标准输出
w 替换第一个匹配的字符串,并且将改动的行输出到磁盘文件中
缺省 替换第一个匹配的字符串

2.6.2 实验

  1. 将有十个数字的那一行替换为miss letitia
#{}要转义
root@wzj-dev:/opt# sed -n -e 's/[0-9]\{10\}/miss letitia/g' -e '1,$ p' test1.txt
letitia
mail
uuencode
miss letitia
01566
  1. 从第一行开始,到以字符ma开头的那一行, 里面的l全转为大写L
sed -n -e '1,/^ma/ s/l/L/g' -e '1,$ p' test1.txt
Letitia
maiL
uuencode
1003605091
01566

3. 子命令组合

对第1-3行做如下操作

  1. l全转为大写L
  2. e全转为大写E
  3. 在第二行前插入一行tyrone字符串
  4. 打印出来 ( 原来的三行加上插入的一行 )
root@wzj-dev:/opt# sed -n '1,3{
            s/l/L/g
            s/e/E/g
            2 i tyrone
            p
            }' test1.txt
LEtitia
tyrone
maiL
uuEncodE
上一篇 下一篇

猜你喜欢

热点阅读