这应该很容易,但是由于某些原因我无法正常工作。
如何替换'['和']'字符之间的所有空格?
以下是示例文本:
[HTTP Referrer] NVARCHAR(MAX) NULL,
[Original URL] NVARCHAR(MAX) NULL,
[Install App Store] NVARCHAR(MAX) NULL,
[Match Type] NVARCHAR(128) NULL,
[Contributor 1 Match Type] NVARCHAR(128) NULL,
[Contributor 2 Match Type] NVARCHAR(128) NULL,
[Contributor 3 Match Type] NVARCHAR(128) NULL,
[Device Category] NVARCHAR(128) NULL,
[Google Play Referrer] NVARCHAR(MAX) NULL,
[Google Play Click Time] DATETIME2 NULL,
[Google Play Install Begin Time] DATETIME2 NULL,
[CreatedOn] DATETIME2 NOT NULL,
[ModifiedOn] DATETIME2 NOT NULL,
[Retired] BIT NOT NULL
如何捕获方括号之间的空格:
替换正则表达式匹配项后,所需的输出将是:
[HTTPReferrer] NVARCHAR(MAX) NULL,
[OriginalURL] NVARCHAR(MAX) NULL,
[InstallAppStore] NVARCHAR(MAX) NULL,
[MatchType]NVARCHAR(128) NULL,
[Contributor1MatchType] NVARCHAR(128) NULL,
[Contributor2MatchType] NVARCHAR(128) NULL,
[Contributor3MatchType] NVARCHAR(128) NULL,
[DeviceCategory] NVARCHAR(128) NULL,
[GooglePlayReferrer] NVARCHAR(MAX) NULL,
[GooglePlayClickTime] DATETIME2 NULL,
[GooglePlayInstallBeginTime] DATETIME2 NULL,
[CreatedOn] DATETIME2 NOT NULL,
[ModifiedOn] DATETIME2 NOT NULL,
[Retired] BIT NOT NULL
我没有发布我正在尝试的正则表达式,因为到目前为止它是垃圾。甚至没有接近标记。
这越来越近了:
(?:\G(?!^)|\[)[^,]*?\K\s(?=[^\]]*)
答案 0 :(得分:1)
您可以使用这种前瞻性正则表达式方法来查找]
字符之前的所有空格:
\h+(?=[^]]*\])
RegEx详细信息:
\h+
:匹配1个以上水平字符(?=[^]]*\])
:先行断言我们前面有]
,中间没有]
或者,您也可以像在问题中那样使用使用\G
的方法:
(?:\[|(?!^)\G)[^]\s]*\K\h+
答案 1 :(得分:0)
这是一个使用sed的实际示例,它通过将其用作分隔符并将其排除在替换之外来定位括号之间的每个空格。
t_STR=$(cat /tmp/example.txt); # slurp in the text
for i in $(seq $(echo "$t_STR"|grep -c ' '));do # how many spaces?
t_STR="$(echo "$t_STR"|sed 's/\(\[.*\) \(.*\]\)/\1\2/g')"; # remove them
done
echo "$t_STR"
如果每对方括号内只有一个空格,则:
sed 's/\(\[.*\) \(.*\]\)/\1\2/' < /tmp/example.txt
可以工作,(即使使用/ g sed,也只能使用此正则表达式删除一个空格。)
您正尝试在每行的前半部分应用“删除空格”,以“]”作为分隔符,因此(在某些情况下)将行分为两行然后{ {1}},然后在两者之间加上“]”。