[英]sed replace text matching complicated regex pattern
我正在將現有數據庫架構移植到Postgresql。
我需要用半逗號替換出現的單詞“ go” 。
我注意到文本中以以下方式出現“開始”一詞:
我想將以下模式替換為以下模式:
我正在嘗試構建一個可與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遵循以下解決方案:
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.