sed 附加命令

写在前面

本篇是个人学习整理笔记而得。
原书:Sed and Awk 101 Hacks -中文版
引用书结尾的一句话:
Knowledge is not one man’s Entity

sed 附加命令

1. sed 附加命令

### 语法
sed '[address] a the-line-to-append' input-file
### 在指定行后添加一行,第2行后添加一行203
sed '2 a 203,Jack,Engineer' employee.txt
### 在匹配行后添加多行
sed '/Jason/a 203,Jack Johnson,Engineer\n204,Mark Smith,Sales Engineer' employee.txt

2. 插入 i 命令

### 语法
sed  '[address] i the-line-to-insert'  input-file
### 在指定行前插入一行,在第2行之前添加一行203
sed '2 i 203,Jack,Engineer' employee.txt
### 插入多行,用法同上

3. 修改 c 命令

### 语法
sed '[address] c the-line-to-insert' input-file
### 用新行取代旧行,可以与 s 命令等价使用
sed '2 c 202,Jack,Engineer' employee.txt
sed '2s/.*/202,Jack,Engineer/' employee.txt
### 可以用多行取代一行,用法同上

4. 打印不可见字符 l 命令

sed -n 'l' dos.txt 
### l 命令后指定数字,会在第n个字符使用一个不可见的自动折行
sed -n 'l 20' employee.txt

5. 打印行号 = 命令

### 打印所有行的行号
sed '=' employee.txt
### 打印指定行的行号
sed '1,3=' employee.txt
### 打印匹配到行的行号
sed '/Jane/=' employee.txt
### 配合-n,打印总行数(最后一行的行号)
sed -n '$=' employee.txt

6. 转换字符 y 命令

### 命令y可以根据对应位置转换字符
# 常用于,大小写转换
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' employee.txt

7. 操作多个文件

sed -n '/root/p' /etc/passwd /etc/group

8. sed退出 q 命令

### 在指定行,退出
sed '3 q' employee.txt
### 匹配到行,退出
sed '/Manager/q' employee.txt

9. 读取文件数据 r 命令

### r命令会读取另一个文件的内容,并在指定的位置打印出来# 在指定到的行,打印另一个文件内容
sed '$r log.txt' employee.txt
### 在匹配到的行,打印另一个文件的内容
sed '/Raj/r log.txt' employee.txt

10. 选项 和 命令

### -l选项用于指定行的长度(需要配合l命令使用)
sed -nl 20 'l' employee.txt
### l命令也可以单独使用指定行长度
sed -n 'l20' employee.txt
### 容易混淆的还有
# -i 选项,直接修改原文件 <> i命令用于插入数据
# -n 选项,屏蔽默认输出 <> n命令打印模式空间

sed 保持空间和模式空间

1. 概念

sed 有两个内置的存储空间:

  • 模式空间:
    如你所知,模式空间用于 sed 执行的正常流程中。该空间 sed 内置的一个缓冲区,用来存放、修改从输入文件读取的内容。
  • 保持空间:
    保持空间是另外一个缓冲区,用来存放临时数据。sed 可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的 sed 命令。我们已经讨论过,每次循环读取数据过程中,模式空间的内容都会被清空,然而保持空间的内容。则保持不变,不会在循环中被删除。

2. 交换 x 命令

命令x(exchange) 用于交换模式空间和保持空间的内容

3. 模式空间复制到保持空间 h命令

命令h(hold), 与x命令不同在于不会改变模式空间当前内容,保持空间的内容会被覆盖

( cat << EOF
John
Doe
CEO
Jason Smith
IT Manager
Raj Reddy
Sysadmin
Anand Ram
Developer
Jane Miller
Sales Manager
EOF
) > empname.txt
]# sed -n -e '/Manager/!h' -e'/Manager/{x;p}' empname.txt
Jason Smith
Jane Miller
######################################################################################
# 逐行的读取,'/Manager/!h'表示遇到不包含Manager关键字的行,就复制到保持空间(注意是覆盖了保
# 持空间原有的内容),'/Manager/{x;p}'表示遇到包含Manager关键字的一行,就与保持空间交换并打印   
# 交换后的模式空间内容(打印内容就是上一行,也就是Manager的姓名)。
######################################################################################

4. 模式空间追加到保持空间 H命令

### 同时管理者姓名和职位
]# sed -n '/Manager/!h;/Manager/{H;x;p}' empname.txt 
Jason Smith
IT Manager
Jane Miller
Sales Manager
#### 格式化为一行
]# sed -n '/Manager/!h;/Manager/{H;x;s/\n/: /p}' empname.txt 
Jason Smith: IT Manager
Jane Miller: Sales Manager

5. 保持空间复制到模式空间 g命令

### 打印管理者的姓名
]# sed -n '/Manager/!h;/Manager/{g;p}' empname.txt 
Jason Smith
Jane Miller

6. 保持空间追加到模式空间 G命令

### 格式打印管理者及其职位
]# sed -n '/Manager/!h;/Manager/{x;G;s/\n/: /p}' empname.txt 
Jason Smith: IT Manager
Jane Miller: Sales Manager
]# 
######################################################################################
# m代表模式空间,h表示保持空间
# 先交换(m中为姓名,h为职位),再h追加到m中(m中姓名和职位分行排列),最后替换换行符
######################################################################################

7. 读取下一行数据附加到模式空间 N命令

### n打印当前模式空间内容并清空,读取下一行到模式空间### N不打印不清空,读取下一行追加到模式空间
]# sed -n 'N;s/\n/: /p' empname.txt 
John: Doe
CEO: Jason Smith
IT Manager: Raj Reddy
Sysadmin: Anand Ram
Developer: Jane Miller

8. 打印多行模式中的第一行 P命令

### p打印模式空间的内容### P打印模式空间的第一行
]# sed -n 'N;/Manager/P' empname.txt 
Jason Smith
Jane Miller
]# sed -n 'N;/Manager/l' empname.txt 
Jason Smith\nIT Manager$
Jane Miller\nSales Manager$
]#
######################################################################################
# 'N' 将下一行追加到当前行(相当于每两行合并成一行,来执行第二条命令,并没有删掉换行符), 
# '/Manager/P' 会匹配是否包含Manager, 如果包含P打印至换行符'\n'(也就是管理者姓名)
######################################################################################

9. 删除多行模式中的第一行 D命令

  • d 删除模式空间的内容,然后读取下一行到空间,并且忽略后边的命令,进行新一次的循环
  • D 删除模式空间的第一行,不读取下一行,忽略后边的命令,在当前空间从头执行命令

10. 命令b 和 :label标签 和 t命令

### :label 定义一个标签### b label 会跳转到label标签执行其之后的命令# 格式打印,并在管理者前加*号
]# sed -n '{
> N;
> s/\n/: /
> /Manager/!b end
> s/^/*/
> :end
> p}' empname.txt
John: CEO
*Jason Smith: IT Manager
Raj Reddy: Sysadmin
Anand Ram: Developer
*Jane Miller: Sales Manager
]#
######################################################################################
# 这里定义了一个end标签,后边接了一个命令p
# 第三行匹配Manager关键字,不匹配的直接跳转到end标签之后
# 匹配的会先执行替换开头为*的操作,然后再执行后边的命令
# t label 如果前面命令执行成功,会跳转到 label标签往下执行后续命令### 否则,按正常流程执行
######################################################################################

]# sed -n '{
N;
s/\n/: /;
:repeat;
/Manager/s/^/*/
/\*\*\*/!t repeat
p }' empname.txt
John: CEO
***Jason Smith: IT Manager
Raj Reddy: Sysadmin
Anand Ram: Developer
***Jane Miller: Sales Manager
]# 
######################################################################################
# 定义了一个repeat标签
# /Manager/s/^/*/ 是循环块,给包含Manager行前加*号# /\*\*\*/!t repeat 匹配是否包含三个*号的行,不包含跳转回repeat标签处# 包含了的话,往下执行
######################################################################################
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351