[命令] Linux 文件管理命令 sed 的使用(修改和打印文本的行)

内容目录:
内容一:sed 格式

内容二:sed 选项

内容三:sed 的参数

内容四:sed 的使用案例
4.1 使用 p 参数打印某一行数据的案例
4.2 使用 a\ 参数在某一行下面追加一行数据的案例
4.3 使用 i\ 参数在某一行上面插入一行数据的案例
4.4 使用 c\ 参数替换某一行数据的案例
4.5 使用 d 参数删除某一行的案例
4.6 使用 s 参数替换某一行某些数据的案例
4.7 使用 h、H、g、G 参数复制和粘贴的案例
4.7.1 sed 命令的工作原理
4.7.2 h、H、g、G、d、D 参数的讲解
4.7.2.1 h、H、g、G、d、D 参数的作用简介
4.7.2.2 h、H、g、G、d、D 的功能示意图
4.7.3 案例

具体的内容:
内容一:sed 格式
sed <选项> <参数> <文件>

内容二:sed 选项
(1)-n 或 --quiet 或 --silent 仅显示处理后的内容,没处理的内容就不显示了
(2)-i 实现数据的变更
(3)-e <脚本> 或 --expression=<脚本> 以指定的脚本来处理输入的文本
(4)-f <脚本文件> 或 --file=<脚本文件> 以指定的脚本文件来处理输入的文本
(5)-h 或 --help 显示帮助内容
(6)-V 或 --version 显示版本信息

内容三:sed 的参数
(1)p 打印某一行的数据
(2)a\ 在某一行下面追加一行的数据
(3)i\ 在某一行上面插入一行的数据
(4)c\ 替换某一行的数据
(5)d 删除某一行
(6)s 替换某一行的某些数据
(7)h、H、g、G 复制和粘贴某些行的数据

内容四:sed 的使用案例
4.1 使用 p 参数打印某一行数据的案例
# sed -n 2p test.txt #在 test.txt 文本里打印第二行的数据
# sed -n 2,4p test.txt #在 test.txt 文本里打印第二行到第四行的数据
# sed -n '$p' test.txt #在 test.txt 文本里打印最后一行的数据
# sed -n '/eternalcenter/p' test.txt #在 test.txt 文本里打印包含 eternalcenter 的数据
# sed -n '/eternalcenter$/p' test.txt #在 test.txt 文本里打印以 eternalcenter 结尾的数据
# sed -n $= test.txt #在 test.txt 文本里输出总行数
# sed -n 'p;n' test.txt #在 test.txt 文本里输出奇数行
# sed -n 'n;p' test.txt #在 test.txt 文本里输出偶数行

4.2 使用 a\ 参数在某一行下面追加一行数据的案例
# sed 2a\eternalcenter test.txt #在 test.txt 文本里在第二行下面追加一行 eternalcenter
# sed /abc/a\eternalcenter test.txt #在 test.txt 文本里在 abc 那一行下面添加一行 eternalcenter
# sed /^a/a\eternalcenter test.txt #在 test.txt 文本里在以 a 开头的行下面添加 eternalcenter

4.3 使用 i\ 参数在某一行上面插入一行数据的案例
# sed -i 2a\eternalcenter test.txt #在 test.txt 文本里在第二行上面插入一行 eternalcenter
# sed -i /abc/a\eternalcenter test.txt #在 test.txt 文本里在 abc 那一行上面添加一行 eternalcenter
# sed -i /^a/a\eternalcenter test.txt #在 test.txt 文本里在以 a 开头的行上面添加 eternalcenter

(注意:这些修改会立刻生效)

4.4 使用 c\ 参数替换某一行数据的案例
# sed 2c\eternalcenter test.txt #在 test.txt 文本里将第二行替换成 eternalcenter
# sed /abc/c\eternalcenter test.txt #在 test.txt 文本里将 abc 那一行替换成 eternalcenter
# sed /^a/c\eternalcenter test.txt #在 test.txt 文本里将以 a 开头的那一行替换成 eternalcenter

4.5 使用 d 参数删除某一行的案例
# sed 2d test.txt 在 test.txt 文本里删除第二行
# sed /abc/d test.txt 在 test.txt 文本里删除包含 abc 的那一行
# sed /^a/d test.txt #在 test.txt 文本里删除以 a 开头的那一行
# sed '2,4d' test.txt #在 test.txt 文本里删除第二行到第四行

4.6 使用 s 参数替换某一行某些数据的案例
# sed 's/eternalcentre/eternalcneter/' test.txt #在 test.txt 文本里将所有行的第一个 eternalcentre 换成 eternalcenter
# sed 's/eternalcentre/eternalcneter/g' test.txt #在 test.txt 文本里将所有行的所有 eternalcentre 换成 eternalcenter
# sed 's/.*eternalcentre.*/eternalcneter/' test.txt #在 test.txt 文本里将包含 eternalcentre 的行换成 eternalcenter
# sed '3s/eternalcentre/eternalcenter/2' 1.txt #在 test.txt 文本里将第三行的第二个 eternalcentre 换成 eternalcenter
# sed 's/^/eternalcenter/g' test.txt #在 test.txt 文本里在所有行前面添加 eternalcenter
# sed '2s/.*/eternalcenter/' test.txt #在 test.txt 文本里将第二行替换成 eternalcenter
# sed '$s/.*/eternalcenter/' test.txt #在 test.txt 文本里将最后一行替换成 eternalcenter
# sed '2,3s/.*/eternalcenter/' test.txt #在 test.txt 文中里将第二到第三行替换成 eternalcenter

# sed -e "s/^\(.*\)\(eternalcenter\)\(.*\)$/\3\2\1/" test.txt
或者
# sed -r "s/(.*)(eternalcenter)(.*)/\3\2\1/" test.txt
#在 test.txt 文本里将 eternalcenter 前面的数据和后面的数据对调位置

(注意:这里的 -r 代表支持扩展正则)

# sed 's/.//1;s/.$//' test.txt #在 test.txt 文本里删除每行的第一个字符和最后一个字符
# sed 's/.//2;s/.$//' test.txt #在 test.txt 文本里删除每行的第二个字符和最后一个字符
# sed -r 's/[0-9]//g;s/^( )+//' test.txt #在 test.txt 文本里删除所有的数字和空格
# sed 's/[A-Z]/(&)/g' test.txt #在 test.txt 文本里将所有的大写字母都添加括号
# sed '7,9s/^/#/' test.txt #在 test.txt 文本里给第七行和第九行前面添加 "#"

4.7 使用 h、H、g、G 参数复制和粘贴的案例
4.7.1 sed 命令的工作原理
(1)从第一行开始一行一行地读取文本里的内容
(2)每读取一行就将数据存入到 pattern space 里面
(3)在 pattern sapce 中执行 sed 命令
(4)再打印 pattern space 中的内容然后将其清空
(5)之后重复以上操作再开始读取文本里的下一行
(6)pattern space 里的数据可以存储到 hold space 里面

(
补充:
pattern space 相当于处理数据的流水线
hold space 相当于暂时存储数据的仓库
)

4.7.2 h、H、g、G、d、D 参数的讲解
4.7.2.1 h、H、g、G、d、D 参数的作用简介
(1)g 将 hold space 中的内容拷贝到 pattern space 中,原来 pattern space 里的内容清除
(2)G 将 hold space 中的内容 append 到 pattern space\n 后
(3)h 将 pattern space 中的内容拷贝到 hold space 中,原来的 hold space 里的内容被清除
(4)H 将 pattern space 中的内容 append 到 hold space\n 后
(5)d 删除 pattern 中的所有行,并读入下一新行到 pattern 中
(6)D 删除 multiline pattern 中的第一行,不读入下一行

4.7.2.2 h、H、g、G、d、D 的功能示意图
P H     P H     P H
1    h  1 1  d    1

P H     P H     P H     P H
2 1  G  2 1  H  2 1  d    1
        1       1 2       2
                  1       1

P H     P H     P H
3 2  G  3 2  h  3 3
  1     2 1     2 2
        1       1 1

P H     P H
3 2  g  2 2
  1     1 1
           
(
注意:
(1)这里的 P 指的是 pattern space
(2)这里的 H 指的是 hold space
)

(
补充:
h 其实就是清空现在粘贴板里的内容然后重新复制
H 其实就是不清空现在粘贴板里的内容然后再再原来粘贴版的内容基础上再追加复制
g 其实就是替换粘贴
G 其实就是追加粘贴
)

4.7.3 案例
# sed -e '1h' -e '3G' test.txt #将第一行的数据添加到第三行后面
# sed -e '1h' -e '3g' test.txt #将第一行的数据替换第三行
# sed -e '1h' -e '2H' -e '3G' test.txt #将第一行和第二行的数据添加到第三行后面
# sed -e '1h' -e '2H' -e '3g' test.txt #将第一行和第二行的数据替换第三行
# sed -e '/^a/h' -e '3G' 1.txt #将第一个以 a 开头的行的数据添加到第三行后面
# sed -e '/^a/h' -e'/^a/H' -e '3G' 1.txt #将第一个和第二个以 a 开头的行的数据添加到第三行后面