我想将匹配结果的特定部分存储为稍后用于替换的变量.我想把它保存在一个班轮中而不是找到我需要的变量.
在配置apache并使用mod_rewrite时,您可以指定要用作变量的模式的特定部分,如下所示:
RewriteRule ^www.example.com/page/(.*)$ http://www.example.com/page.php?page=$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)
括号内包含的模式匹配部分存储为$ 1以供日后使用.因此,如果网址是www.example.com/page/home,它将被替换为www.example.com/page.php?page=home.所以比赛的"主场"部分保存在$ 1中,因为它是括号内部模式的一部分.
我想要一个像sed命令这样的功能,我需要自动替换SQL转储文件中的许多字符串,如果在每个create table之前存在命令,则添加drop table,但是我需要知道表名来执行此操作,所以如果转储文件包含以下内容:
...
CREATE TABLE `orders`
...
Run Code Online (Sandbox Code Playgroud)
我需要运行类似的东西:
cat dump.sql | sed "s/CREATE TABLE `(.*)`/DROP TABLE IF EXISTS $1\N CREATE TABLE `$1`/g"
Run Code Online (Sandbox Code Playgroud)
得到的结果:
...
DROP TABLE IF EXISTS `orders`
CREATE TABLE `orders`
...
Run Code Online (Sandbox Code Playgroud)
我在sed命令中使用mod_rewrite语法作为我正在尝试做的事情的逻辑示例.
有什么建议?
Jon*_*ler 11
sed '/CREATE TABLE \([^ ]*\)/ s//DROP TABLE IF EXISTS \1; &/'
Run Code Online (Sandbox Code Playgroud)
查找CREATE TABLE语句并捕获表名.将其替换为"DROP TABLE IF EXISTS"和表名,加上分号以终止语句,以及匹配的内容副本以保留CREATE TABLE语句.
这是经典的sed表示法.既然你正在使用bash,你就有可能使用GNU sed并且需要添加--posix使用这种表示法,或者你需要使用GNU的非标准正则表来编写脚本sed.我也没有尝试在输出中插入换行符.你可以用GNU做到这一点,sed如果它对你来说足够重要的话.
关键点是括号(通常需要使用反斜杠进行转义)是捕获机制,反斜杠数是替换机制.
sed -r "s/CREATE TABLE (\`.*\`)/DROP TABLE IF EXISTS \1\n &/g" dump.sql
Run Code Online (Sandbox Code Playgroud)
测试:
kent$ cat t.txt
CREATE TABLE `orders`
...
CREATE TABLE `foo`
...
...
CREATE TABLE `bar`
...
kent$ sed -r "s/CREATE TABLE (\`.*\`)/DROP TABLE IF EXISTS \1\n &/g" t.txt
DROP TABLE IF EXISTS `orders`
CREATE TABLE `orders`
...
DROP TABLE IF EXISTS `foo`
CREATE TABLE `foo`
...
...
DROP TABLE IF EXISTS `bar`
CREATE TABLE `bar`
...
Run Code Online (Sandbox Code Playgroud)
这称为“反向引用”。sed 将开始对括号之间的内容进行编号。\(...\)
请注意上面使用反斜杠作为转义字符。
参考:https : //www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html
| 归档时间: |
|
| 查看次数: |
10345 次 |
| 最近记录: |