0.总结
  • LawsonAbs的认知与思考,不一定完善和准确,还请各位读者怀批判思维阅读。
  • 持续更新

1.参数详解

-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)

这意思就是说:就地修改文件
Linux 命令详解之sed_sed
下面说一个常用的命令:

s/regexp/replacement/
Attempt to match regexp against the pattern space. If successful, replace that portion matched with replacement. The replacement may contain the special character & to refer to that portion of the pattern space which matched, and the special escapes \1 through \9 to refer to the corresponding matching sub-expressions in the regexp.

2.命令详解
  • 1.只是输出显示变化了,但是没有真正的修改文件【有两种命令】
[root@littlelawson ~]# sed 's/little/xiaomi/' test.txt 
1	xiaomi
2	google
3	baidu
4	alibaba

再看一下原文件中的内容,并没有任何改变:

[root@littlelawson ~]# cat test.txt 
1	little
2	google
3	baidu
4	alibaba
[root@littlelawson ~]# sed -n 's/little/xiaomi/p' test.txt 
1	xiaomi
[root@littlelawson ~]# cat test.txt
1	little
2	google
3	baidu
4	alibaba
  • 2.选择符合条件的文本,进行真实的修改。有两种方法
[root@littlelawson ~]# sed -i 's/little/xiaomi/g' test.txt 
[root@littlelawson ~]# cat test.txt 
1	xiaomi
2	google
3	baidu
4	alibaba
  • 注意 -i 且 最后一个/后没有p 或者 g符号
[root@littlelawson ~]# sed -i 's/xiaomi/little/' test.txt 
[root@littlelawson ~]# cat test.txt 
1	little
2	google
3	baidu
4	alibaba
  • -i 参数 且最后有p参数
[root@server4 shells]# cat file2.txt 
1	xiaomi
2	great
2	great
3	baidu
4	alibaba
[root@server4 shells]# 
[root@server4 shells]# sed -i 's/xiaomi/litter/p' file2.txt 
[root@server4 shells]# cat file2.txt 
1	litter
1	litter
2	great
2	great
3	baidu
4	alibaba

发现这个p参数 的作用是:对于替换的数据,再生成一条

  • -i参数且有g参数
[root@server4 shells]# cat file2.txt 
1	litter
1	litter
2	great
2	great
3	baidu
4	alibaba
[root@server4 shells]# 
[root@server4 shells]# 
[root@server4 shells]# 
[root@server4 shells]# sed -i 's/litter/xiaomi/g' file2.txt 
[root@server4 shells]# cat file2.txt 
1	xiaomi
1	xiaomi
2	great
2	great
3	baidu
4	alibaba

发现p 以及 g参数功能相同。

2. 参数详解

  • -n 参数
    控制自动打印
-n, --quiet, --silent
    suppress automatic printing of pattern space
[root@server4 shells]# cat file2.txt 
1	xiaomi
2	great
3	baidu
4	alibaba
[root@server4 shells]# 

不使用-n参数

[root@server4 shells]# sed 's/great/google/p' file2.txt 
1	xiaomi
2	google
2	google
3	baidu
4	alibaba

使用-n参数

[root@server4 shells]# sed -n 's/great/google/p' file2.txt 
2	google
  • -i参数
    如果使用-i参数,则表示就地编辑文件(即修改文件),如果提供了后缀,则会有一个备份
-i[SUFFIX], --in-place[=SUFFIX]
              edit files in place (makes backup if SUFFIX supplied)

接下来展示一下替换+备份的功能(配合/g参数):

[root@server4 temp]# cat file2.txt
1	xiaomi
2	great
3	baidu
4	alibaba
[root@server4 temp]# sed -i.bak 's/great/google/g' file2.txt 
[root@server4 temp]# ll
total 8
-rw-------. 1 root root 36 Nov 22 19:05 file2.txt
-rw-------. 1 root root 35 Nov 22 18:58 file2.txt.bak
[root@server4 temp]# cat file2.txt.bak 
1	xiaomi
2	great
3	baidu
4	alibaba
[root@server4 temp]# cat file2.txt
1	xiaomi
2	google
3	baidu
4	alibaba

---------------------------------------------------------------------------------------------------
[root@littlelawson ~]# cat test.sh
#!/bin/bash
newname=`pwd`
echo $newname >> HelloLinux.txt
echo kafka
echo hadoop
echo spark
echo  HelloLinux
  • 4.查看第二行的内容
[root@littlelawson ~]# sed -n 2p test.sh
newname=`pwd`
  • 5.查看第2行到第10行【如果大于文件总行数,则显示到文件的最后一行】
[root@littlelawson ~]# sed -n 2,10p test.sh
newname=`pwd`
echo $newname >> HelloLinux.txt
echo kafka
echo hadoop
echo spark
echo  HelloLinux

3. 可用场景

3.1 删除某个文件的第一行

删除文件xxx.csv的第一行 : sed -i '1d' xxx.csv

  • 示例如下
[root@server4 shells]# cat file1.txt
spark
hadoop
hbase
zookeeper
[root@server4 shells]# sed -i '1d' file1.txt
[root@server4 shells]# cat file1.txt
hadoop
hbase
zookeeper
  • 删除第二行
[root@server4 shells]# cat file1.txt
hadoop
hbase
zookeeper
[root@server4 shells]# sed -i '2d' file1.txt
[root@server4 shells]# cat file1.txt
hadoop
zookeeper

3.2 替换某个文件夹下所有包含指定字符的文件

例如:我想替换掉当前目录下的包含unix的所有文件成 linux。那么可以这么写命令。

  • 查看 当前文件夹下的文件内容:
[root@server4 temp]# cat data1.txt 
1 mac 2000
2 winxp 4000
3 bsd 1000
4 unix 1000
[root@server4 temp]# cat file1.txt 
unix
hadoop
zookeeper
  • 执行如下命令:
[root@server4 temp]# sed -i 's/unix/linux/g' `grep unix -rl .`
  • 再次查看文件内容
[root@server4 temp]# cat data1.txt 
1 mac 2000
2 winxp 4000
3 bsd 1000
4 linux 1000
[root@server4 temp]# cat file1.txt 
linux
hadoop
zookeeper