我正在将现有数据库架构移植到Postgresql。
我需要用半逗号替换单词'go'的出现次数。
我注意到“go”这个词出现在文本中,格式如下:
我想用以下模式替换上面的模式:
我正在尝试构建一个可以与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
答案 0 :(得分:1)
使用sed的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
字之前只有空格,则替换不匹配,并且不替换任何内容。
答案 1 :(得分:1)
awk -v RS='\\s*go' '{print $0""(RT ~ /go/? ";\n\n": "")}' file.txt
记录分隔符RS
设置为0或更多空格字符,后跟go
。 GNU awk然后将记录分隔符的两个连续实例之间的文本块视为记录。因此,打印记录后跟一个自定义记录分隔符(;
后跟两个换行符)