1

タイトルが十分に説明的でない場合は申し訳ありませんが、要約する方法が本当にわかりません。提案は大歓迎です。特定のテーブル (キャッシュを含む) にデータを挿入する sql ファイルの行を照合するための便利な正規表現を作成しました。こんなふうになります:

(--\s--\sDumping\sdata\sfor\stable\s`(cache_\w+|cache)`.*?)(?=(--\n--.+Table\sstructure\sfor\stable\s`.+`.*--))

だから今、私はこのようなファイルを持っているとき:

--
-- Table structure for table `cache_content`
--

something

--
-- Dumping data for table `cache_content`
--

INSERT INTO `cache_content` etc.


--
-- Table structure for table `cache`
--

something

--
-- Dumping data for table `cache`
--

INSERT INTO `cache` etc.


--
-- Table structure for table `notcache`
--

something

--
-- Dumping data for table `notcache`
--

これらのテーブルへのすべての挿入に一致し、を使用してそれらを削除したいと思います (これらはキャッシュのあるテーブルであるため) sed。具体的には、これを行うための簡単な bash スクリプトを作成しました。

REGEX="(--\s--\sDumping\sdata\sfor\stable\s\`(cache_\w+|cache)\`.*?)(?=(--\n--.+Table\sstructure\sfor\stable\s\`.+\`.*--))"
sed -i "s/${REGEX}//g" $1

問題は、私の正規表現テスターでは機能することですが、 ではまったく機能しませんsedsedファイルをまったく変更しないだけで、私は困惑しています。行ベースの記事をどこかで読みsedましたが、これが問題なのか、それとも別の何かでしょうか?

追加#1:それが不可能な場合sed、良い代替手段は何ですか?それを行うsedのようなものはありますか?

4

4 に答える 4

2

sedいいえ、行指向であり、パターンが複数の行にわたって一致する必要があるため、使用できません。(パターンを開始パターンと終了パターンに分割して を試すこともできますが、 の行範囲は入力で 1 回しか一致しないため、テーブルごとに/start_pattern/,/end_pattern/p個別の が必要になります。)start_patternsed

で単純化された開始パターン/終了パターンのアプローチを取ることができるはずですawk:

awk 'BEGIN { x = 1 }; /^-- Dumping data for table `cache(_[a-zA-Z0-9]+)?`$/ { x = 0 }; /^-- Table structure for table `[^`]+`$/{ x = 1 }; (x == 1) { print }' $1

または、「実際の」スクリプト言語で、ファイル全体に対する1つの巨大な正規表現アプローチを(いくつかの小さな変更を加えて)引き続き使用できます。

ruby -e 'File.write(ARGV[0],File.read(ARGV[0]).gsub(/(--\s--\sDumping\sdata\sfor\stable\s`(?:cache_\w+|cache)`.*?)(?=(?:--\n--\s+Table\sstructure\sfor\stable\s`[^`]+`\s*\n--))/m,""))' $1
于 2013-11-13T23:52:44.213 に答える
1

そもそも回避できるのに、なぜ追加の作業を作成するのですか? :)

興味のないテーブルのステートメントを生成しないでください。たとえば、MySQL を使用している場合:

mysqldump --ignore-table=<...> --ignore-table=<...> 

他のデータベースにも同様のオプションがあります。

于 2013-11-14T00:05:40.083 に答える
0

すべてをバッファに保持してsedを開始します

sed "H
$ {
  x
#  your code here
  }
  1. H 各行をバッファにロードする
  2. 最後の行 ($) が発生したとき
  3. 現在の行をバッファーと交換します (すべてのファイルが作業領域にあるようにします)
  4. あなたのコードはすべての行で機能します。

注意してください、^ と $ はファイルの最初と最後の文字であり、\n で区切られた行はもうありません

于 2013-11-14T07:55:49.287 に答える
0

sed の代わりに、perl を使用してみてください。

perl -e 'undef $/; $_ = <>; s/YOUR_REGEX_HERE//gs; print' $1
于 2013-11-13T23:51:16.883 に答える