1

現在、既存のデータベース スキーマを Postgresql に移植しています。

「go」という単語をセミコンマに置き換える必要があります。

「go」という単語がテキストに次のパターンで表示されていることに気付きました。

  • [空でない文字列 (SQL)]
  • [1 つまたは複数の改行が続く]
  • [1 つ以上の空白が続く]
  • [「行く」という言葉が続く]
  • [1 つ以上の新しい行が続く]

上記のパターンを次のパターンに置き換えたい:

  • [空でない文字列 (SQL)]
  • [に続く ';']
  • [2 つの新しい行が続く]

上記の置換を実行するために、sedで使用できる正規表現を構築しようとしていますが、正規表現は比較的初めてです。

明確にするために、実現したい置換の前後にサンプルテキストを含めました。

-- Original File contents below -------



go
CREATE TABLE foobar
(
    f1    INT,
    f2    INT,
    f3    FLOAT,
        f4    VARCHAR(32) NOT NULL,
    f5    INT,
    f6    datetime,
        f7    smallint
)


go

GRANT UPDATE, INSERT, DELETE, SELECT ON foobar TO dbusr
go
CREATE UNIQUE INDEX idxu_foobar ON foobar (f1, f2)

go


--- REPLACED FILE CONTENTS -----------



go
CREATE TABLE foobar
(
    f1    INT,
    f2    INT,
    f3    FLOAT,
        f4    VARCHAR(32) NOT NULL,
    f5    INT,
    f6    datetime,
        f7    smallint
);

GRANT UPDATE, INSERT, DELETE, SELECT ON foobar TO dbusr;
CREATE UNIQUE INDEX idxu_foobar ON foobar (f1, f2);

これを達成するために使用する式を誰でも手伝ってくれるので、実行できます: sed -i 's/original_match_expr/replacement_expr/g' myfile.sql

4

2 に答える 2

1

ガウク

awk -v RS='\\s*go' '{print $0""(RT ~ /go/? ";\n\n": "")}' file.txt

レコード セパレータRSは、0 個以上の空白文字に設定され、その後にgo. 次に、GNU awk は、レコード セパレータの 2 つの連続するインスタンス間のテキスト ブロックをレコードとして扱います。そのため、レコードの後に​​カスタム レコード セパレータ (;その後に 2 つの改行が続く) を出力します。

于 2013-11-02T20:21:46.480 に答える
1

GNUのバージョンを使用して、次のソリューションを試してください。

sed -ne ':a; $! { N; ba }; s/\([^[:space:]]\)[[:space:]]*go/\1;/g; p' infile

ファイル全体をバッファーに読み取り、goその前にあるすべての単語とすべての空白をセミコロンに置き換えます。次の結果が得られます。

go
CREATE TABLE foobar
(
    f1    INT,
    f2    INT,
    f3    FLOAT,
        f4    VARCHAR(32) NOT NULL,
    f5    INT,
    f6    datetime,
        f7    smallint
);

GRANT UPDATE, INSERT, DELETE, SELECT ON foobar TO dbusr;
CREATE UNIQUE INDEX idxu_foobar ON foobar (f1, f2);

編集して説明を追加します(コメントを参照):

見た目ほど難しくありません。

:a; $! { N; ba }入力のすべての行をバッファに読み込むループです。

[[:space:]]任意の空白文字に一致し、それを[^[:space:]]否定します。したがって、置換コマンドは、最後の非空白文字から単語までを置換しますgo。最初のケースのように、単語の前に空白しかないgo場合、置換は一致せず、何も置換しません。

于 2013-11-02T20:18:42.610 に答える