[英]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.