sed匹配模式
| 选项 |
含义 |
| -n |
只打印模式匹配行 |
| -e |
直接在命令行进行sed编辑,默认选项 |
| -f |
编辑动作保存在文件中,指定文件执行 |
| -r |
支持扩展正则表达式 |
| -i |
直接修改文件内容 |
# name: file.txtI love pythonI love Python
# name: edit.sed
/python/p
sed -n '/python/p' file.txt
sed -n -e '/python/p' -e '/Python/p' file.txt
sed -n -f edit.file file.txt
sed -n -r '/python|Python/p' file.txt
sed -i 's/love/like/g' file.txt
| pattern用法表 |
|
| 10command |
匹配到第10行 |
| 10,20command |
匹配从第10行开始, 到第20行结束 |
| 10,+5command |
匹配从第10行开始, 到第16行结束 |
| /pattern1/command |
匹配到pattern1的行 |
| /pattern1/,/pattern2/command |
匹配到pattern1的行开始, 到匹配到pattern2的行结束 |
| 10,/pattern1/command |
匹配从第10行开始, 到匹配到pattern1的行结束 |
| /pattern1/,10command |
匹配到patter1的行开始, 到第10行匹配结束 |
# 打印文件的第17行
sed -n "17p" file
# 打印文件的10到20行
sed -n "10, 20p" file
# 打打印文件第10行开始, 往后加5行的所有行
sed -n "10,+5p" file
# 打印文件中以root开头的行
sed -n "/^root/p" file
# 打印文件中以root开头, 到以bin开头的行
sed -n "/^root/,/^bin/p" /etc/passwd
# 打印文件中从第4行开始, 到以xie开头的行
sed -n "4,/^xie/p" /etc/passwd
sed -n "/^root/,4p" /etc/passwd
sed编辑命令
| 类别 |
编辑命令 |
含义 |
| 查询 |
p |
打印 |
| 增加 |
a |
行后追加 |
|
i |
行前追加 |
|
r |
外部文件读入, 行后追加 |
|
w |
匹配行写入指定文件 |
| 删除 |
d |
删除 |
| 修改 |
s/old/new |
将行内的第一个old替换为new |
|
s/old/new/g |
将行内全部的old替换为new |
|
s/old/new/2g |
同一行内, 从第2个开始, 替换剩下的 |
|
s/old/new/ig |
将行内old全部替换为new, 忽略大小写 |
# cp /etc/passwd ./
sed -i '1d' passwd
sed -i '1,3d' passwd
# 删除包含/sbin/nologin的用户
sed -i '/\/sbin\/nologin/d' passwd
# 删除以mail开头, 到以ftp开头的行
sed -i '/^mail/,/^ftp/d' passwd
# 在包含/bin/bash的行后添加This is user
sed -i '/\/bin\/bash/a This is user' passwd
# 在以hdfs开头行到以yarn开头行之间的每行前添加AAA
sed -i '/^hdfs/,/^yarn/i AAA' passwd
# 在以hdfs开头行到以yarn开头行之间的每行后追加file.txt文件里的内容
sed -i '/^hdfs/,/^yarn/r file.txt' passwd
# 将包含/bin/bash的所有行写入到/tmp/user_login.txt文件中
sed -n '/\/bin\/bash/w /tmp/user_login.txt' passwd
# 将文件中包含/bin/bash的行替换为大写
sed -i 's/\/bin\/bash/\/BIN\/BASH/g' passwd
# 将文件中每行第2个bin替换为BIN
sed -i 's/bin/BIN/2' passwd
# 将文件中每行非全部大写的hadoop替换为HADOOP (忽略大小写)
sed -i 's/hadoop/HADOOP/ig' file
# 将文件中的hadaap, hadccp, hadeep全部替换为hadoop
sed -i 's/had..p/hadoop/g' file
# 将文件中的hadaap, hadccp, hadeep, 在后面追加s ( & 和 \1 表示反向引用, 元括号也可以替换其中一部分 )
sed -i 's/had..p/&s/g' file
sed -i 's/\(had..p\)/\1s/g' file
sed -i 's/\(had\).../\1oop/g' file
sed查找内容
| 查询命令 |
含义 |
| 1p |
打印第1行内容 |
| 1,10p |
打印第1行到第10行的内容 |
| 1,+5p |
打印第1行到+5行的内容 |
| /pattern1/p |
打印每行中匹配到pattern1的行内容 |
| /pattern1/,/pattern2/p |
打印匹配到pattern1的行直到匹配到pattern2的所有行的内容 |
| /pattern1/,10p |
打印匹配到pattern1的行到10行的所有内容 |
| 10,/pattern1/p |
打印第10到直到匹配到pattern1的所有行内容 |
sed删除内容
| 查询命令 |
含义 |
| 1d |
删除第1行内容 |
| 1,10d |
删除第1行到第10行的内容 |
| 1,+5d |
删除第1行到+5行的内容 |
| /pattern1/d |
删除每行中匹配到pattern1的行内容 |
| /pattern1/,/pattern2/d |
删除匹配到pattern1的行直到匹配到pattern2的所有行的内容 |
| /pattern1/,10d |
删除匹配到pattern1的行到10行的所有内容 |
| 10,/pattern1/d |
删除第10到直到匹配到pattern1的所有行内容 |
# 删除第15行
sed -i '15d' /etc/passwd
# 删除8到14行
sed -i '8,14d' /etc/passwd
# 删除mail开头, 到yarn开头的行
sed -i '/^mail/,/^yarn/d' /etc/passwd
# 删除第一个不能登录的用户, 到第13行的所有内容
sed -i '/\/sbin\/nologin/,13d' /etc/passwd
# 删除以yarn开头的行, 到最后行的所有内容
sed -i '/^yarn/,$d' /etc/passwd
sed修改内容
| 编辑命令 |
含义 |
| 1s/old/new/ |
替换第1行内容old为new |
| 1,10s/old/new/ |
替换第1行到10行的内容old为new |
| 1,+5s/old/new/ |
替换第1行到+5行的内容old为new |
| /pattern1/s/old/new/ |
替换匹配到pattern1的行内容old为new |
| /pattern1/,/pattern2/s/old/new/ |
替换匹配到pattern1的行到匹配到pattern2的所有行内容old为new |
| /pattern1/,10s/old/new/ |
替换匹配到pattern1的行到10行的所有内容old为new |
| 10,/pattern1/s/old/new |
替换第10行到匹配到pattern1的所有行内容old为new |
# 修改/etc/passwd的第1行中第1个root为ROOT
sed -i '1s/root/ROOT/' /etc/passwd
# 修改/etc/passwd中第5行到10行中所有的/sbin/nologin为/bin/bash
sed -i '5,10s/\/sbin\/nologin/\/bin\/bash/g' /etc/passwd
# 修改/etc/passwd中匹配到/sbin/nologin的行, 将匹配到行中的login改为LOGIN
sed -i '/\/sbin\/nologin/s/login/LOGIN/' /etc/passwd
常见用法示例
# 1. a (append)
# passwd文件第10行后面追加"Add Line Behind"
sed -i '10a Add Line Behind' passwd
# passwd文件第10行到第20行, 每一行后面追加"Test Line Behind"
sed -i '10,20a Test Line Behind' passwd
# passwd文件匹配到/bin/bash的行后面追加"Insert Line For /bin/bash Behind"
sed -i '/\/bin\/bash/a Insert Line For /bin/bash Behind' passwd
# 2. i
# passwd文件匹配到yarn开头的行, 在匹配行前面追加"Add Line Before"
sed -i '/^yarn/i Add Line Before' passwd
# passwd文件每一行前面都追加"Insert Line Before Every Line"
sed -i 'i Insert Line Before Every Line' passwd
# 3. r
# 将/etc/fstab文件的内容追加到passwd文件中第20行后面
sed -i '20r /etc/fstab' passwd
# 将/etc/inittab文件内容追加到passwd文件匹配/bin/bash行后面
sed -i '/\/bin\/bash/r /etc/inittab' passwd
# 将/etc/vconsole.conf文件内容追加到passwd文件中特定行后面,匹配以ftp开头的行, 到第18行的所有行
sed -i '/^ftp/,18r /etc/vconsole.conf' passwd
# 4. w
# 将passwd文件匹配到/bin/bash的行追加到/tmp/sed.txt文件中
sed -i '/\/bin\/bash/w /tmp/sed.txt' passwd
# 将passwd文件从第10行开始, 到匹配到hdfs开头的所有行内容追加到/tmp/sed.txt
sed -i '10,/^hdfs/w /tmp/sed.txt' passwd