sed命令基础
sed命令基础
sed编辑器
sed编辑器被称作流编辑器(stream editor)。
流编辑器会在编辑器处理数据之前,基于预先提供的一组规则来编辑流。(说人话就是把输入的内容处理一下得到你想要的内容再输出)
那如何得到想要的结果那,接着往下看。
sed命令格式如下
sed options script file
下面分别介绍几部分可以填的内容
options
选项 | 描述 |
---|---|
-e script | 在处理输入时,将script中的命令添加到已有的命令中 |
-f file | 在处理输入时,将file中指定的命令添加到已有的命令中 |
-n | 不产生命令输出,使用print命令来完成输出 |
-r,-R | 使用扩展正则表达式语法 |
-i | 直接修改原文件(必须包含file部分) |
file
要读取的文件
# 输入
$ sed 's/root/a/' 1.tx
# 输出
PID USER TIME COMMAND
1 a 0:00 init
2 a 0:00 [kthreadd]
3 a 0:00 [kworker/0:0-eve]
4 a 0:00 [kworker/0:0H-kb]
5 a 0:00 [kworker/u2:0-ev]
6 a 0:00 [mm_percpu_wq]
# 本例子中使用的s命令是把第一个root替换成a
script
这里的情况比较多所以放在了最后一点来说
替换标记
上一小点中我们已经说了s替换命令的使用,替换命令在替换多行文本时是可以正常实现的,但是默认情况下它只会替换每一行的第一处。
如果想让替换命令替换一行中的不同位置,这就需要用到替换标记
一共有4种替换标记
标记 | 作用 |
---|---|
数字 | 表明新文本替换行内第n处匹配到的位置 |
g | 表明新文本将会替换行内所有匹配到的内容 |
p | 表明要把修改后的内容行打印出来 |
w file | 把替换好的内容写到文件file中 |
让我们通过4个例子来分析
# 1.txt
ab abc bcd def
abc ab bcc abd
# 输入
$ sed 's/ab/**/2' 1.txt
# 输出
ab **c bcd def
abc ** bcc abd
# 1.txt
ab abc bcd def
abc ab bcc abd
# 输入
$ sed 's/ab/**/g' 1.txt
# 输出
** **c bcd def
**c ** bcc **d
# 输入
$ sed 's/def/*/p' 1.txt
# 输出
ab abc bcd *
ab abc bcd *
abc ab bcc abd
# 如果配合上-n选项禁止输出,就会只输出修改过的内容
# 输入
$ sed -n 's/def/*/p' 1.txt
# 输出
ab abc bcd *
# w标记产生的效果,何-n配合p标记的结果是一样的,不过是将输出保存到指定文件中
# 输入
$ sed 's/def/*/w 2.txt' 1.txt
# 输出
ab abc bcd *
abc ab bcc abd
# 2.txt
ab abc bcd *
特殊字符的替换
会有一些比较特殊的字符出现扰乱我们原本的处理方式,比如(/)
想要使用/我们需要使用转义字符
# 输入
$ echo '/bin/bash' | sed 's/\/bin/\/user\/bin/'
# 输出
/user/bin/bash
这通常会带来一些疑惑和错误(反正我不会这么写)
要解决这个问题我们来看下一个例子,sed允许我们使用其他字符来替换原有的(/)分隔符
# 输入
$ echo '/bin/bash' | sed 's#/bin#/user/bin#'
# 输出
/user/bin/bash
# 注意调换后分隔符一致就可以,它可以用绝多数内容进行分割包括字符和数字
# 不过个人感觉还是用比较明显的字符看起来会舒服一下
使用地址
默认情况下,sed命令会作用于数据的所有行,如果想将命令作用与特定行或某些行,则必须用行寻址(line addressing)
有两种形式的行寻址
两种形式都使用相同的模式来指定地址
[address]command
或
address {
command1
command2
command3
}
1、以数字形式表示行区间
当使用数字的方式行寻址的时候,sed编辑器会将文本的第一行记为编号1,
然后继续按照顺序进行接下来分配行号。
# 指定第5行
$ sed '5s/root/a/' 1.txt
# 指定区间2到5行
$ sed '2,5s/root/a/' 1.txt
# 如果想要从n行到行末,但又不知道最后一行时第几行,使用$
$ sed '2,$s/root/a/' 1.txt
2、用文本模式来过滤出行
这种方法会相对复杂一些,必须使用如下格式
/pattern/command
命令会只作用到符合pattern的行上
未完待续...