gpt4 book ai didi

regex - 使用 sed 过滤多行 pcregrep 匹配

转载 作者:行者123 更新时间:2023-12-02 00:19:18 24 4
gpt4 key购买 nike

我有多个文本文件中的数据,如下所示:

1  DAEJ             X            -3120041.6620      -3120042.0476     -0.3856      0.0014               
Y 4084614.2137 4084614.6871 0.4734 0.0015
Z 3764026.4954 3764026.7346 0.2392 0.0014

HEIGHT 116.0088 116.6419 0.6332 0.0017 0.0017 8.0
LATITUDE 36 23 57.946407 36 23 57.940907 -0.1699 0.0013 0.0012 57.5 0.0012 62.9
LONGITUDE 127 22 28.131395 127 22 28.132160 0.0190 0.0012 0.0013 2.3 0.0013

我想通过过滤器运行它,这样输出将如下所示:

DAEJ: 36 23 57.940907, 127 22 28.132160, 116.6419

我可以使用 grepWin 使用命名捕获通过搜索轻松地做到这一点:

(?<site>\w\w\w\w+)<filler>\r\n\r\n<filler>(?<height>\-?\d+\.\d+)<filler>(?<heightRMS>\d+\.\d+)<filler>\r\n<filler>(?<lat>\-?\ *\d+\ +\d+\ +\d+\.\d+)<filler>(?<latRMS>\d+\.\d+)<filler>\r\n<filler>(?<lon>\-?\ *\d+\ +\d+\ +\d+\.\d+)<filler>(?<lonRMS>\d+\.\d+)<filler>

并重新调整(忽略未引用的组,我将在其他实现中使用它):

$+{site}: $+{lat}, $+{lon}, $+{height}

当然,代价是通过 GUI 手动完成。我想知道是否有一种方法可以通过将 pcregrep 输出管道传输到 sed 来进行文本替换来编写脚本?我知道 pcregrep -M 选项可以匹配上面的多行正则表达式模式,直到那时我都成功了,但我仍然坚持使用 sed问题结束。

最佳答案

我将使用 awk 来处理您的文本文件:

awk '$1 ~ /^[0-9]+$/ { printf "%s: ", $2 } $1 == "HEIGHT" { height = $3 } $1 == "LATITUDE" { printf "%s %s %s, ", $2, $3, $4 } $1 == "LONGITUDE" { printf "%s %s %s, %s\n", $5, $6, $7, height }' file.txt

为了便于阅读,分成多行:

$1 ~ /^[0-9]+$/ { 
printf "%s: ", $2
}

$1 == "HEIGHT" {
height = $3
}

$1 == "LATITUDE" {
printf "%s %s %s, ", $2, $3, $4
}

$1 == "LONGITUDE" {
printf "%s %s %s, %s\n", $5, $6, $7, height
}

结果:

DAEJ: 36 23 57.946407, 127 22 28.132160, 116.6419

编辑:

将以下代码放入名为 script.awk 的文件中:

$3 == "X" {
printf "%s: ", $2
}

$1 == "HEIGHT" {
height = $3
}

$1 == "LATITUDE" {
if ($2 == "-" && $6 == "-") { printf "-%s %s %s, ", $7, $8, $9 }
else if ($2 == "-") { printf "%s %s %s, ", $6, $7, $8 }
else if ($5 == "-") { printf "-%s %s %s, ", $6, $7, $8 }
else { printf "%s %s %s, ", $5, $6, $7 }
}

$1 == "LONGITUDE" {
if ($2 == "-" && $6 == "-") { printf "-%s %s %s, %s\n", $7, $8, $9, height }
else if ($2 == "-") { printf "%s %s %s, %s\n", $6, $7, $8, height }
else if ($5 == "-") { printf "-%s %s %s, %s\n", $6, $7, $8, height }
else { printf "%s %s %s, %s\n", $5, $6, $7, height }
}

像这样运行:

awk -f script.awk file.txt

关于regex - 使用 sed 过滤多行 pcregrep 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11663185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com