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