我想将匹配结果的特定部分存储为变量,以备后用。我想将其保存在一行中,而不是事先找到我需要的变量。
当配置 apache 和使用 mod_rewrite 时,您可以指定模式的特定部分用作变量,如下所示:
RewriteRule ^www.example.com/page/(.*)$ http://www.example.com/page.php?page=$1 [R=301,L]
括号内包含的模式匹配部分存储为 $1 供以后使用。因此,如果 url 是 www.example.com/page/home
,它将被替换为 www.example.com/page.php?page=home
。所以匹配的“home”部分保存在 $1 中,因为它是括号内模式的一部分。
我想用 sed
命令实现类似的功能,我需要自动替换 SQL 转储文件中的许多字符串,在每个创建表之前添加 drop table if exist 命令,但我需要知道执行此操作的表名,因此如果转储文件包含类似以下内容:
...
CREATE TABLE `orders`
...
我需要运行类似的东西:
cat dump.sql | sed "s/CREATE TABLE `(.*)`/DROP TABLE IF EXISTS $1\N CREATE TABLE `$1`/g"
获取结果:
...
DROP TABLE IF EXISTS `orders`
CREATE TABLE `orders`
...
我在 sed
命令中使用 mod_rewrite 语法作为我正在尝试做的事情的逻辑示例。
有什么建议吗?
最佳答案
sed '/CREATE TABLE \([^ ]*\)/ s//DROP TABLE IF EXISTS \1; &/'
找到一个CREATE TABLE 语句并捕获表名。将其替换为“DROP TABLE IF EXISTS”和表名,外加一个分号以终止该语句,以及匹配内容的副本以保留 CREATE TABLE 语句。
这是经典的 sed
表示法。由于您正在使用 bash
,因此您可能正在使用 GNU sed
并且需要添加 --posix
才能使用该表示法,或者您需要调整脚本以使用 GNU 的非标准 sed
正则表达式。我也没有尝试在输出中插入换行符。如果它对您来说足够重要,您可以使用 GNU sed
来做到这一点。
重点是圆括号(通常需要用反斜杠转义)是捕获机制,反斜杠数字是替换机制。
关于bash - 在 sed 命令中使用占位符/变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12898945/