簡體   English   中英

sed替換文本匹配復雜的正則表達式模式

[英]sed replace text matching complicated regex pattern

我正在將現有數據庫架構移植到Postgresql。

我需要用半逗號替換出現的單詞“ go”

我注意到文本中以以下方式出現“開始”一詞:

  • [非空字符串(SQL)]
  • [之后是一個或多個新行]
  • [后跟一個或多個空格]
  • [后跟'去'這個詞]
  • [之后是一個或多個新行]

我想將以下模式替換為以下模式:

  • [非空字符串(SQL)]
  • [其次是 ';']
  • [后接兩個新行]

我正在嘗試構建一個可與sed一起使用的正則表達式,以執行上述替換操作-但我對regex還是比較陌生。

為了清楚起見,我在要實現的替換之前和之后添加了示例文本:

-- 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

嘗試使用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 } :a; $! { N; ba }是一個循環,它將輸入的每一行讀取到緩沖區。

[[:space:]]匹配任何空格字符,而[^[:space:]]則將其取反。 因此,替換命令從最后一個非空白字符開始替換,直到單詞go為止。 如果像第一種情況那樣在go單詞之前只有空白,則替換不匹配並且不會替換任何內容。

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

記錄分隔符RS設置為0或多個空格字符,然后設置go 然后,GNU awk將兩個連續的記錄分隔符實例之間的文本塊視為一條記錄。 因此,先打印記錄,然后再自定義記錄分隔符( ;然后是兩個換行符)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM