对于多字符 RS 使用 GNU awk 并假设您想去掉“CONSTRAINT”之前的逗号:
$ cat tst.awk
BEGIN{ RS="^$"; ORS="" }
{
gsub(/\<GO\>/,"\034")
gsub(/,\s*CONSTRAINT[^\034]+\034/,")")
gsub(/\034/,"GO")
print
}
$ gawk -f tst.awk file
CREATE TABLE Table1(
column1 double NOT NULL,
column2 varchar(60) NULL,
column3 varchar(60) NULL,
column4 double NOT NULL)
GO
上述方法通过将每个独立的“GO”替换为不太可能出现在您的输入中的控制字符(在这种情况下,我使用与默认 SUBSEP 相同的值),因此我们可以在否定字符中使用该字符中间的列表 gsub() 以创建一个以“CONSTRAINT”之后的第一个“GO”结尾的正则表达式。这是在 awk 中进行“非贪婪”匹配的一种方法。
如果没有你知道的字符不能出现在你的输入中,你可以像这样创建一个:
$ cat tst.awk
BEGIN{ RS="^$"; ORS="" }
{
gsub(/a/,"aA"); gsub(/b/,"aB"); gsub(/\<GO\>/,"b")
gsub(/,\s*CONSTRAINT[^b]+b/,")")
gsub(/b/,"GO"); gsub(/aB/,"b"); gsub(/aA/,"a")
print
}
$
$ gawk -f tst.awk file
CREATE TABLE Table1(
column1 double NOT NULL,
column2 varchar(60) NULL,
column3 varchar(60) NULL,
column4 double NOT NULL)
GO
上面最初将所有“a”转换为“aA”,将“b”转换为“aB”,这样
- 记录中不再有任何“b”,并且
- 由于所有原始的“a”现在后面都有一个“A”,因此唯一出现的
“aB”表示“bs”最初所在的位置
这意味着我们现在可以将所有“GO”转换为“b”,就像我们在上面的第一个脚本中将它们转换为“\034”一样。然后我们执行主 gsub(),然后展开我们的初始 gsub()。
gsub()ing 的想法是创建以前不存在的字符,使用这些字符,然后展开初始的 gsub()s 是一个非常有用的学习和记忆习语,例如有关其他应用程序,请参阅 https://stackoverflow.com/a/13062682/1745001。
一步一步地看它工作:
$ cat file
foo bar Hello World World able bodies
$ awk '{gsub(/a/,"aA")}1' file
foo baAr Hello World World aAble bodies
$ awk '{gsub(/a/,"aA"); gsub(/b/,"aB")}1' file
foo aBaAr Hello World World aAaBle aBodies
$ awk '{gsub(/a/,"aA"); gsub(/b/,"aB"); gsub(/World/,"b")}1' file
foo aBaAr Hello b b aAaBle aBodies
$ awk '{gsub(/a/,"aA"); gsub(/b/,"aB"); gsub(/World/,"b"); gsub(/Hello[^b]+b/,"We Are The")}1' file
foo aBaAr We Are The b aAaBle aBodies
$ awk '{gsub(/a/,"aA"); gsub(/b/,"aB"); gsub(/World/,"b"); gsub(/Hello[^b]+b/,"We Are The"); gsub(/b/,"World")}1' file
foo aBaAr We Are The World aAaBle aBodies
$ awk '{gsub(/a/,"aA"); gsub(/b/,"aB"); gsub(/World/,"b"); gsub(/Hello[^b]+b/,"We Are The"); gsub(/b/,"World"); gsub(/aB/,"b")}1' file
foo baAr We Are The World aAble bodies
$ awk '{gsub(/a/,"aA"); gsub(/b/,"aB"); gsub(/World/,"b"); gsub(/Hello[^b]+b/,"We Are The"); gsub(/b/,"World"); gsub(/aB/,"b"); ; gsub(/aA/,"a")}1' file
foo bar We Are The World able bodies