正则表达式命令行更改每行的格式
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
我尝试了 grep
、sed
、gawk
和 |
(管道)的组合来尝试模式匹配,然后将格式更改为更像这样...
[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
我有一个文件,其中包含格式与此类似的行...
/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
我尝试了 grep
、sed
、gawk
和 |
(管道)的组合来尝试模式匹配,然后将格式更改为更像这样...
[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