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的行上


未完待续...

posted @ 2022-08-25 17:08  灬F灬  阅读(38)  评论(0编辑  收藏  举报