1. sed打印某行到某行之间的内容
2. sed 转换大小写
- 将单词首字母转化大写
- 将所有小写转化大写
3. sed 在某一行最后面添加一个数字
4. 删除某行到最后一行
解析: {:a;N;$!ba;d}
:a : 是做一个标识符, 标识符名称为 a(此处名称可以自定义)
N 将下一行文本读入 待操作空间(pattern space), sed操作是先将一行读入(pattern space) 模式空间, 然后根据命令处理这一行文本.
$!ba 可以拆解为 b:流程控制 回到前面一个标记 :(分号标记点) 的位置 即 a 标记,(这里的b 是 break 的意思) $! 为 b语句的判断条件, 如果满足这个条件即执行 break :a 这个动作,
# 这个 :a COMMAND; $!b:a 有点像是C语言的 do{}while(); 语句 这个do{} 就是:a 以及后继的命令, while() 就是 $!b:a , 而 $! 仅仅是 while() 里面的判断条件.
# 这里的仅仅是有点相似, 准确的说 :a COMMAND; $!b:a 更像是 汇编或C 里面 loop: goto 语句, 一个标记点, 另一个是跳转.
---------
/^abc/ # 匹配 abc 开头的行
p # 打印上面匹配到的行
:a # 做标记
N # 将该行的下一行读入 模式空间
$!ba # 满足 $!(没有到最后一行) 条件时 跳回 :a 标记处
d # 当上面语句执行完毕时,执行该语句, 删除
:a; COMMAND ;//ba
语句实验
- 上面操作 是 匹配
/.*/
所有内容,{:a;N;3!ba}
将 第三行以及之前的内容读入pattern 空间内,;p
将 pattern 空间内的 内容 打印出来.
5. sed 的空间概念
sed 命令在处理文件内容时, 会将当前行存储在临时缓冲区内, 称为(pattern space), 接着sed 命令处理缓冲区内的内容, 处理结束后, 会将缓冲区内的内容按照命令指定方式处理(默认会print, 也可以指定d :delete) 接着会清理缓冲区, 处理下一行, 重复上面动作.
sed 还有一段保留空间(hold space) 相当于仓库, 用户可以根据 需要将当前行内容放入该空间中, 便于后面需要时取出.
空间的相关操作:
d Delete 了 pattern space 的内容
h H 复制/追加 pattern space 的内容到 hold space
g G 复制/追加 hold space 的内容到 pattern space
x 交换 hold space 和pattern space内容
n 读取下一个输入行, 用下一个命令处理, 而不是从第一个命令开始处理
N 读取下一行到 pattern space 内, 和pattren space 内原有的内容作为一行处理. 会改变当前的行号
- 将
123
开头的行移到ee
开头的行, 并将ee
行 放到最后一行. 使用 hold space 做存储可以很方便做到这些.
6. sed 中遇到N 会将下一行连带汇总在一起处理
7. 打印2到6行含某个字符串的行
8. awk 中使用外部变量
awk -v val=$val
9.awk 合并文件
10. 过滤多个关键字
END