10

一致した結果の特定の部分を変数として保存し、後で置換に使用したい。事前に必要な変数を見つけるのではなく、これをワンライナーに保ちたいと思います。

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ます。したがって、一致の「ホーム」部分は、括弧内のパターンの一部であるため、$1 に保存されました。

コマンドでこの機能のようなものが欲しいのですがsed、SQL ダンプ ファイル内の多くの文字列を自動的に置き換えて、各テーブルを作成する前に存在する場合はテーブルを削除するコマンドを追加する必要がありますが、これを行うにはテーブル名を知る必要があります。ダンプ ファイルには次のようなものが含まれます。

...
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 構文を使用しています。

助言がありますか?

4

4 に答える 4

13
sed '/CREATE TABLE \([^ ]*\)/ s//DROP TABLE IF EXISTS \1; &/'

CREATE TABLE ステートメントを見つけて、テーブル名を取得します。これを「DROP TABLE IF EXISTS」とテーブル名、ステートメントを終了するためのセミコロン、および CREATE TABLE ステートメントを保持するために一致したもののコピーに置き換えます。

これは古典的なsed表記法です。を使用しているためbash、GNUsedを使用している可能性があり、その表記法を使用するために追加する必要がある--posixか、GNU の非標準sed正規表現を使用するためにスクリプトを調整する必要があります。また、出力に改行を挿入しようとはしていません。sedそれがあなたにとって十分に重要であれば、GNUでそれを行うことができます。

重要なポイントは、括弧 (従来はバックスラッシュでエスケープする必要があります) がキャプチャ メカニズムであり、バックスラッシュ番号が置換メカニズムです。

于 2012-10-15T15:39:20.510 に答える
6
 sed -r "s/CREATE TABLE (\`.*\`)/DROP TABLE IF EXISTS \1\n &/g" dump.sql

テスト:

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`
...
于 2012-10-15T15:42:36.357 に答える
5

これを「後方参照」と呼びます。そして、sed は括弧内のものに番号を付け始めます。\(...\)

上記のエスケープ文字としてバックスラッシュを使用していることに注意してください。

参照: https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html

于 2016-02-26T17:18:00.203 に答える