bash - 在 sed 命令中使用占位符/变量

标签 bash sed awk

我想将匹配结果的特定部分存储为变量,以备后用。我想将其保存在一行中,而不是事先找到我需要的变量。

当配置 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/

相关文章:

linux - 如何将脚本的输出保存到日志中

bash - 将两个文件与各自的字段进行比较,并以特定格式输出

bash - 如何同时使用 nohup 和 time ?

bash - 如果字符出现少于 20 次,则从列中删除字符

sed - 在 awk 或 sed 中将十六进制转换为十进制

linux - 如何在 bash 脚本中格式化输出字符串以供另一个脚本输入?

bash - 如何使用 bash 对文件中的每一列求和

mysql - 通过终端将 sql 文件导入数据库。有没有办法为 "ERROR 1366 at line ***: Incorrect integer value: ' 设置默认值?

perl - awk 文件操作

bash - 如何用另一个文件的映射值替换 csv 文件中的第 n 个字段?