sed 行编辑器,取一行处理一行
sed [OPTION]... 'script;script;script' [input-file]...
script可以写多个;隔开就行了
-n 关闭默认自动打印
-e 多点编辑相当于或的功能
-r,E 启用扩展正则表达式
-i.bak 使用.bak备份文件并在原文件启用编辑
注意:
-i -r 不要写成-ir可以写成-ri
脚本格式
'地址命令'
地址:
1.不给地址全文进行处理
2.单个地址
sed '2' #第二行
sed '/pattern/' #pattern匹配到的行
这个含义表示,符合pattern的行都会打印
3.地址范围
sed '2,3' #2到3行
sed '2,+3' #2行往后3行
sed '/pattern1/,/pattern2/'
这个模式的匹配规则是这样的:
pattern1匹配到开始到pattern2匹配到第一个立即结束,如果后面还有符合pattern1的又会立马开始,直到遇到pattern2或者结束
sed '2,/pattern/'
sed '2~3' #2开始步长3,2,5,8
命令
p 打印行,追加到默认输出行后
d 删除行
a [\]text 在指定行之后追加 支持\n
i [\]text 在指定行之前追加
c [\]text 替换行为单行或多行文本
! 模式空间匹配到的行取反
查找替代
sed -n 's/pattern/string/修饰符'
g 行内全局替换
查找替换支持替换内容向前引用
echo "abc666xyz" | sed 's@(abc)(666)(xyz)@\1\3@' #第2个部分被删除
echo "abc666xyz" | sed 's@.*@&6666@' #&符号表示对前面匹配的引用
取ifconfig ens160的结果的IP
ifconfig ens160 |sed -En '2s/^.*inet\s//p' | sed -E 's/[[:space:]]*net.*//'
ifconfig ens160 |sed -En '2s/^.*inet\s(.*)[[:space:]]{2}netmask.*$/\1/p'
修改网卡名为eth0
修改/etc/default/grub 中GRUB_CMDLINE_LINUX=这一行后面加上 net.ifnames=0
sed -E -i.bak 's/^(GRUB_CMDLINE_LINUX=.*)"/\1 net.ifnames=0"$/' /etc/default/grub
sed 的完全体
sed '地址 搜索替换 命令' 其中地址,搜索替换,命令可以自由组合
sed '2s/目标/替换/命令'
sed '/正则匹配行/s/匹配这一行某个部分/替换/命令'
sed -i.bak '/^GRUB_CMDLINE_LINUX=/s/"$/ net.ifnames=0"' /etc/default/grub
修改网卡名字为eth0
/etc/default/grub
这一行,修改为如下
GRUB_CMDLINE_LINUX="resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap rhgb quiet net.ifnames=0"
然后执行命令
grub2-mkconfig -o /etc/grub2.cfg
然后reboot
N 命令, 读取匹配到的行的下一行追加至模式空间
cat test.txt
1 a
2 b
3 c
4 d
sed -nr 'N;s/\n//p' test.txt
1 a2 b
3 c4 d