sed学习笔记

一、sed的行选择

打印第三行(3表示等号,p表示打印)

  1. sed -n '3p' /etc/passwd

打印2至5行

  1. sed -n '2,5p' /etc/passwd

从第2行开始,每隔2行打印一行

  1. sed -n '2~3p' /etc/passwd

打印最后一行

  1. sed -n '$p' /etc/passwd

打印包含或不包含root的行

  1. sed -n '/root/p' /etc/passwd
  2. sed -n '/root/! p' /etc/passwd

打印包含/bin/bash的行(\%regexp%可以不用转义斜杠)

  1. sed -n '\%/bin/bash%p' /etc/passwd

忽略大小写的搜索

  1. sed -n '\%/BIN/bash%Ip' /etc/passwd或sed -n '/\/BIN\/bash/Ip' /etc/passwd

搜索从开始到sshd字符的范围

  1. sed -n '0,/sshd/p' /etc/passwd

二、sed的正则表达式语法

char
只匹配本身char
*
匹配之前字符的0个或更多
\+
与*相比,只是匹配1个或更多
\?
匹配前面字符的0个或1个
\{i\}
匹配前面字符的i个,i是整数
\{i,j\}
匹配前面字符的i至j个,包含i和j
\{i,\}
匹配前面字符的i个或i个以上
\(regexp\)
分组字符,两个作用1、\(abcd\)*会搜索0个或多个abcd字符,abcd是作为一个整体2、作为反向引用,可以使用\1 \2等引用。
.
匹配任何字符,包括换行符
^
匹配行的开始
$
匹配行的结束
[list]
匹配list中的任单字符,如l,i,s,t
[^list]
反向匹配l,i,s,t
regexp1\|regexp2
匹配regexp1或者regexp2
regexp1regexp2
匹配regexp1与regexp2连接
\n
匹配换行字符
\char
匹配特殊字符,如$, *, ., [, \, ,^

三、常用命令

在之前sed的行选择我们使用了p,即打印命令,下面介绍更多的命令
q
退出命令,sed ’11 q’ /etc/passwd 相当于head /etc/passwd
d
删除命令,sed ‘1 d’ /etc/passwd 删除第一行
p
打印命令,一般与-n选项连用

四、替换命令s

s是sed中最常用到且最重要的命令了,下面详细介绍此命令的用法。
sed最简单的用法如下:
把root替换成rooter
sed ‘s/root/rooter/’ /etc/passwd

命令的格式为:s/regexp/replacement/flags

replacement可以是\n(n为1到9的数字),表示引用regexp里的\(matching\):如
echo “123abc” | sed ‘s/\([0-9]*\).*/\1/’
\([0-9]*\).*匹配了123abc,而\([0-9]*\)匹配123,所以\1内容为123,所以这个例子的结果为123。

replacement也可以是&,表示reqexp匹配到的内容,如:
echo “123 abc” | sed ‘s/[0-9]*/& &/’
结果为:
123 123 abc

replacement还可以是\L, \l, \U, \u, \E,意思如下:
\L
把replacement字母转换成小写,直到\U或\E出现。
\l
把下个字符转换成小写。
\U
把replacement字母转换成大写,直到\L或\E出现。
\u
把下个字符转换成大写。
\E
停止以\L或\U开始的大小写转换。
一些例子如下:

  1. 1、把ABC转换为小写
  2. echo "ABC" | sed 's/[A-Z]*/\L&\E/' 或
  3. echo "ABC" | sed 's/[A-Z]/\l&/g'
  4. 把abc转换为大写
  5. echo "abc" | sed 's/[a-z]*/\U&\E/' 或
  6. echo "abc" | sed 's/[a-z]/\u&/g'

flags的可选值如下:
g
将replacement应用于所有reqexp所匹配的,不仅仅是第一个的匹配。
number
只替换第n个的匹配
p
当替换已经完成,打印新的结果
w file-name
当替换完成,把新结果保存到文件
I
i
忽略大小写。
M
m
使^和$为空字符

五、少用的命令

y/source-chars/dest-chars/
source-chars与dest-chars长度要相同,转换是一一对应的,如a转换成A,b转换成B:sed ‘y/ab/AB/’

a\
text
在指定位置增加内容,如在含有root下一行增加I am root:
sed ‘/root/ a\I am root’ /etc/passwd

i\
text
在指定位置插入内容,如在含有root上一行增加I am root:
sed ‘/root/ i\I am root’ /etc/passwd

c\
text
用text替换匹配的行,如把含有root的行内容替换为I am root:
sed ‘/root/ c\I am root’ /etc/passwd
=
打印行号,如显示含有root所在的行号:sed -n ‘/root/=’ /etc/passwd

l n
以n个长度分割匹配到的行,并以\结尾,如以长度为4个字符分隔含有root的行:sed ‘/root/ l 4’ /etc/passwd

r filename
读取文件到输出,如在含有root的行下面插入file文件:sed ‘/root/r file’ /etc/passwd

w filename
保存输出流到文件,如保存含有root的行到file文件:sed ‘/root/w file’ /etc/passwd

N
增加一行并附下一行内容,如两行合并成一行:sed ‘N;s/\n//’ /etc/passwd

六、一些示例

文本间隔:
——–
# 在每一行后面增加一空行

  1. sed G /etc/passwd

# 将原来的所有空行删除并在每一行后面增加一空行。
# 这样在输出的文本中每一行后面将有且只有一空行。

  1. sed '/^$/d;G'

# 在每一行后面增加两行空行

  1. sed 'G;G'

# 在匹配式样“regex”的行之后插入一空行

  1. sed '/regex/G'

编号:
——–
# 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符”
# (tab,见本文末尾关于’\t’的用法的描述)而不是空格来对齐边缘。

  1. sed = /etc/passwd | sed 'N;s/\n/\t/'

# 对文件中的所有行编号,但只显示非空白行的行号。

  1. sed '/./=' filename | sed '/./N; s/\n/ /'

# 计算行数 (模拟 “wc -l”)

  1. sed -n '$='

选择性地显示特定行:
——–
# 显示文件中的前10行 (模拟“head”的行为)

  1. sed 10q /etc/passwd

# 显示文件中的第一行 (模拟“head -1”命令)

  1. sed q

# 只显示匹配正则表达式的行(模拟“grep”)

  1. sed -n '/regexp/p'               # 方法1
  2.  sed '/regexp/!d'                 # 方法2

# 显示包含“AAA”、“BBB”或“CCC”的行(任意次序)

  1. sed '/AAA/!d; /BBB/!d; /CCC/!d'  # 字串的次序不影响结果

# 显示包含65个或以上字符的行

  1. sed -n '/^.\{65\}/p'

# 显示包含65个以下字符的行

  1. sed -n '/^.\{65\}/!p'            # 方法1,与上面的脚本相对应
  2.  sed '/^.\{65\}/d'                # 方法2,更简便一点的方法

# 从第3行开始,每7行显示一次

  1. sed -n '3~7p'                   # 只对GNU sed有效
  2.  sed -n '3,${p;n;n;n;n;n;n;}'     # 其他sed

示例摘自:http://sed.sourceforge.net/sed1line_zh-CN.html
官方文档:http://www.gnu.org/software/sed/manual/sed.html

发布于:2019-11-23 08:02:04