正则表达式命令行更改每行的格式

Regex command line change format of each line

我有一个文件,其中包含格式与此类似的行...

/data/file.geojson?10,20,30,40
/data/file.geojson?bbox=-5.20751953125,49.05227025601607,3.0322265625,56.46249048388979
/data/file.geojson?bbox=-21.46728515625,45.99696161820381,19.2919921875,58.88194208135912
/data/file.geojson?bbox=-2.8482055664062496,54.38935426009769,-0.300750732421875,55.158473983815306
/data/file.geojson?bbox=-21.46728515625,45.99696161820381,19.2919921875,58.88194208135912
/data/file.geojson?bbox=-21.46728515625,45.99696161820381,19.2919921875,58.88194208135912

我尝试了 grepsedgawk|(管道)的组合来尝试模式匹配,然后将格式更改为更像这样...

[10,40],[30,40],[30,20][10,20],
[-5.20751953125,56.46249048388979],[3.0322265625,56.46249048388979].....

希望您从第一行就明白了,这样我就不必手动输入所有示例了!

我掌握了匹配坐标的正则表达式。实际上输入文件是从 apache 访问日志中提取的结果。如果它们只匹配正整数,可能 read/understand 答案会更容易,然后我将能够插入更多 complicated pattern to match the right range.

sed 去除数字之前的项目,然后 awk 按逗号拆分并以不同的顺序输出。假设数据在名为 "td.txt"

的文件中
sed 's/^[^0-9-]*//' td.txt|awk -F, '{print "["",""],["",""],["",""],["",""],"}'

您可以使用以下方式进行匹配:

(\/data\/file\.geojson\?(?:bbox=)?)([0-9.-]+),([0-9.-]+),([0-9.-]+),([0-9.-]+)

并替换为以下内容:

[,],[,]

DEMO

为了能够像您一样排列结果,重要的是能够访问每行的最后一个值。

如果使用 awk,则不需要模式匹配。您可以通过一组定界符拆分输入字符串并重新组合结果字段。 40 可以访问为 $(NF)30 可以访问为 $(NF-1) 等等。

awk -F'[?,=]' '
    {printf "[%s,%s],[%s,%s],[%s,%s],[%s,%s]\n",
        $(NF-3),$(NF),$(NF-1),$(NF),
        $(NF-1),$(NF-2),$(NF-3),$(NF-2)
    }' file

我使用 ?,= 作为字段分隔符。这使得访问感兴趣的列变得简单。

输出:

[10,40],[30,40],[30,20],[10,20]
[-5.20751953125,56.46249048388979],[3.0322265625,56.46249048388979],[3.0322265625,49.05227025601607],[-5.20751953125,49.05227025601607]
[-21.46728515625,58.88194208135912],[19.2919921875,58.88194208135912],[19.2919921875,45.99696161820381],[-21.46728515625,45.99696161820381]
[-2.8482055664062496,55.158473983815306],[-0.300750732421875,55.158473983815306],[-0.300750732421875,54.38935426009769],[-2.8482055664062496,54.38935426009769]
[-21.46728515625,58.88194208135912],[19.2919921875,58.88194208135912],[19.2919921875,45.99696161820381],[-21.46728515625,45.99696161820381]
[-21.46728515625,58.88194208135912],[19.2919921875,58.88194208135912],[19.2919921875,45.99696161820381],[-21.46728515625,45.99696161820381]

顺便说一句,sed也可以在这里使用:

sed -r 's/.*[?=]([^,]+),([^,]+),([^,]+),(.*)/[,],[,],[,],[,]/' file

该命令在单独的捕获组中捕获每个末尾的数字,并 re-assembles 在替换部分中捕获它们。

并非所有 sed 版本都支持 + 量词。最兼容的版本应该是这样的:)

sed 's/.*[?=]\([^,]\{1,\}\),\([^,]\{1,\}+\),\([^,]\{1,\}\),\(.*\)/[,],[,],[,],[,]/' file

这可能对你有用 (GNU sed):

sed -r 's/^.*\?[^-0-9]*([^,]*),([^,]*),([^,]*),([^,]*)/[,],[,],[,],[,]/' file

或更多 toothpicks:

sed 's/^.*\?[^-0-9]*\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\)/[,],[,],[,],[,]/' file