在使用 sed进行查找替换是我们也是可以使用正则表达式>正则表达式的, 不过sed默认只能使用基础正则表达式>正则表达式, ?
和 <> 和()分组等这些扩展正则表达式>正则表达式在sed里面默认是不能用的。
sed支持的正则元字符如下:
元字符 作用
* 前一个字符匹配0次或任意多次.
. 匹配除了换行符外任意一个字符.
^ 匹配行首. 例如:^hello 会匹配以 hello 开头的行.
$ 匹配行尾. 例如:hello& 会匹配以 hello 结尾的行.
[] 匹配中括号中指定的任意一个字符,制匹配一个字符. 例如:[aoeiu] 匹配任意一个元音字母,[0-9] 匹配任意一位数字,[a-z][0-9]匹配小写字和一位数字构成的两位字符.
[^] 匹配除中括号的字符以外的任意一个字符. 例如:[^0-9] 匹配任意一位非数字字符,[^a-z] 表示任意一位非小写字母.
\ 转义符. 用于取消特殊符号的含义.
\{n\} 表示其前面的字符恰好出现 n 次. 例如:[0-9]\{4\} 匹配 4 位数字,[1][3-8][0-9]\{9\} 匹配手机号码.
\{n,\} 表示其前面的字符出现不小于 n 次. 例如:[0-9]\{2,\}表示两位及以上的数字.
\{n,m\} 表示其前面的字符至少出现 n 次,最多出现 m 次. 例如:[a-z]\{6,8\} 匹配6到8位的小写字母.
sed正则匹配使用示例
- 查找替换字符串整行
使用sed将文件 Dockerfile中以ENV PHP_VERSION 开头的内容替换为 ENV PHP_VERSION ${PHP_VERSION}
替换 ENV PHP_SHA256="xxxxx" 为自定义的变量PHP_SHA256
下面的 ^表示匹配字符串的开始, $ 表示匹配字符串行的结尾。
# 定义一个变量
PHP_VERSION=8.4.2# 使用sed将文件 Dockerfile中以ENV PHP_VERSION 开头的内容替换为 ENV PHP_VERSION ${PHP_VERSION}
sed -i 's/^ENV PHP_VERSION */ENV PHP_VERSION '${PHP_VERSION}'/g' DockerfilePHP_SHA256="xxxxxxxxx"sed -i 's/ENV PHP_SHA256=*$/ENV PHP_SHA256="'${PHP_SHA256}'"/g' Dockerfile
- 查找替换字符
替换文件Dockerfile中的版本字符串, 下面的 [0-9.]* 可以匹配类似 php-8.4.2. 的内容, 这里和在其他地方使用正则不太一样,这里的 * 表示前面的 0-9. 多次或者1次,注意这个地方不能使用分组,也不能使用 +
sed -i -e 's/distributions\/php-[0-9.]*/distributions\/php-'${PHP_VERSION}'./g' Dockerfile
Dockerfile内容示例
ENV PHP_VERSION 8.4.2
ENV PHP_URL="https://www.php.net/distributions/php-8.4.2.tar.xz" PHP_ASC_URL="https://www.php.net/distributions/php-8.4.2.tar.xz.asc"
ENV PHP_SHA256="92636453210f7f2174d6ee6df17a5811368f556a6c2c2cbcf019321e36456e01"