sed
(stream editor)是一个非常强大的文本处理工具,它可以进行文本的查找、替换、删除、插入等操作。在sed
中,进行查找替换操作是最常用的功能之一。下面是一些基本的sed
查找替换用法:
基本替换
-
语法:
sed 's/查找的字符串/替换的字符串/' 文件名
这会在文件中查找第一个匹配的字符串,并将其替换为指定的字符串。
全局替换 , 末尾加g
-
语法:
sed 's/查找的字符串/替换的字符串/g' 文件名
使用
g
标志进行全局替换,即替换文件中所有匹配的字符串。
忽略大小写的替换 , 末尾加i
-
语法:
sed 's/查找的字符串/替换的字符串/gi' 文件名
i
标志表示忽略大小写。
使用变量进行替换
在shell脚本中,你可能希望使用变量来进行查找和替换:
search="查找的字符串"
replace="替换的字符串"
sed "s/$search/$replace/g" 文件名
注意:在双引号中使用变量,以便shell能够展开它们。
保存更改到文件 -i
-
使用
-i
选项可以直接修改文件,而不是输出到标准输出:sed -i 's/查找的字符串/替换的字符串/g' 文件名
修改源文件的同时, 备份原文件 -i.bak
, -i.后缀名
, -i自定义后缀无空格
-
使用
-i
选项时,你可以指定一个扩展名来备份原文件:sed -i.bak 's/查找的字符串/替换的字符串/g' 文件名
这会将原文件备份为
文件名.bak
,然后替换文件中的文本。
也能用其它后缀, 不能有空格, 如 -i240711
, -ijklmn
都能执行
sed
的替换可用:斜杠/
,竖或|
,井号#
等符号, 但是… … 查找只能用斜杠/
替换必须用s开头, 如:s/
, s|
, s#
例如:
s/正则/替换内容/
s/正则/替换内容/g
s|正则|替换内容|
s|正则|替换内容|g
s#正则#替换内容#
s#正则#替换内容#g
当内容包含斜杠/
时, (例如路径) , 使用 竖或|
,井号#
比较方便, 可以不用转义路径分隔符斜杠/
与替换相比, 查找只能用斜杠 /
, sed '/hello/
不能写成 sed ‘|hello|’ 或 sed ‘#hello#’
ip addr|sed '/inet /'
效果类似 ip addr|grep 'inet '
sed
的查找和替换可以一起用
sed
的查找和替换可以一起用, 先用查找过滤一部分内容, 再在剩余的内容中执行替换.
查找只能用/
, 例如:
将所有包含"hello"的行中的"world"替换成"世界" , 可写成:
/hello/s/world/世界/
/hello/s/world/世界/g
/hello/s|world|世界|
/hello/s|world|世界|g
/hello/s#world#世界#
/hello/s#world#世界#g
实测:
tempStringVar="$(echo -e "
hello world world world
world world world world
hello world world world
world world world world
hello world world world
world world world world
")"
echo "${tempStringVar}" | sed '/hello/s/world/世界/'
echo "${tempStringVar}" | sed '/hello/s/world/世界/g'
echo "${tempStringVar}" | sed '/hello/s|world|世界|'
echo "${tempStringVar}" | sed '/hello/s|world|世界|g'
echo "${tempStringVar}" | sed '/hello/s#world#世界#'
echo "${tempStringVar}" | sed '/hello/s#world#世界#g'
结果:
[root@1235vm-c69w yum.repos.d]# tempStringVar="$(echo -e "
> hello world world world
> world world world world
> hello world world world
> world world world world
> hello world world world
> world world world world
> ")"
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s/world/世界/'
hello 世界 world world
world world world world
hello 世界 world world
world world world world
hello 世界 world world
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s/world/世界/g'
hello 世界 世界 世界
world world world world
hello 世界 世界 世界
world world world world
hello 世界 世界 世界
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s|world|世界|'
hello 世界 world world
world world world world
hello 世界 world world
world world world world
hello 世界 world world
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s|world|世界|g'
hello 世界 世界 世界
world world world world
hello 世界 世界 世界
world world world world
hello 世界 世界 世界
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s#world#世界#'
hello 世界 world world
world world world world
hello 世界 world world
world world world world
hello 世界 world world
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s#world#世界#g'
hello 世界 世界 世界
world world world world
hello 世界 世界 世界
world world world world
hello 世界 世界 世界
world world world world
实测2
tempStringVar="
hello world world world
world world world world "
echo "${tempStringVar}" | sed '/hello/s/world/世界/'
echo "${tempStringVar}" | sed '/hello/s/world/世界/g'
echo "${tempStringVar}" | sed '/hello/s|world|世界|'
echo "${tempStringVar}" | sed '/hello/s|world|世界|g'
echo "${tempStringVar}" | sed '/hello/s#world#世界#'
echo "${tempStringVar}" | sed '/hello/s#world#世界#g'
结果
[root@1235vm-c69w yum.repos.d]# tempStringVar="
> hello world world world
> world world world world "
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s/world/世界/'
hello 世界 world world
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s/world/世界/g'
hello 世界 世界 世界
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s|world|世界|'
hello 世界 world world
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s|world|世界|g'
hello 世界 世界 世界
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s#world#世界#'
hello 世界 world world
world world world world
[root@1235vm-c69w yum.repos.d]# echo "${tempStringVar}" | sed '/hello/s#world#世界#g'
hello 世界 世界 世界
world world world world