首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed过滤多行pcregrep匹配

使用sed过滤多行pcregrep匹配
EN

Stack Overflow用户
提问于 2012-07-26 13:51:27
回答 2查看 812关注 0票数 3

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

代码语言:javascript
复制
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

我想通过一个过滤器来运行它,这样输出就会如下所示:

代码语言:javascript
复制
DAEJ: 36 23 57.940907, 127 22 28.132160, 116.6419

我可以很容易地使用grepWin,通过搜索以下内容来使用命名捕获:

代码语言:javascript
复制
(?<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>

和repacing with (忽略未引用的组,我将在其他实现中使用它):

代码语言:javascript
复制
$+{site}: $+{lat}, $+{lon}, $+{height}

但当然,代价是通过GUI手动完成此操作。我想知道有没有办法通过管道pcregrep输出到sed进行文本替换来编写脚本?我知道可以使用pcregrep -M选项来匹配上面的多行正则表达式模式,并且在此之前我一直很成功,但是我还是坚持使用sed来解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-26 14:30:17

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

代码语言:javascript
复制
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

为提高可读性,分成多行:

代码语言:javascript
复制
$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
}

结果:

代码语言:javascript
复制
DAEJ: 36 23 57.946407, 127 22 28.132160, 116.6419

编辑:

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

代码语言:javascript
复制
$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 }
}

像这样运行:

代码语言:javascript
复制
awk -f script.awk file.txt
票数 3
EN

Stack Overflow用户

发布于 2012-07-26 16:23:26

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed '/^DAEJ/,/^\s*LONGITUDE/!d;/HEIGHT/{s/^\s*\S*\s*\S*\s*\(\S*\).*/\1/;h};/LATITUDE/{s/^\s*\(\S*\s*\)\{4\}\(\(\S*\s*\)\{2\}\S*\).*/\2/;H};/LONGITUDE/!d;s/^\s*\(\S*\s*\)\{4\}\(\(\S*\s*\)\{2\}\S*\).*/ \2/;H;g;y/\n/,/;s/\([^,]*\),\(.*\)/DAEJ: \2, \1/' file1 file2 filen
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11663185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档