首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件gsub作用

条件gsub作用
EN

Stack Overflow用户
提问于 2018-08-02 08:02:53
回答 1查看 326关注 0票数 1

根据this的答案,我试图复制一个条件语句,在匹配的情况下,会发生替换(它匹配日期)。如果没有匹配,则按原样打印行。

代码语言:javascript
复制
#!/bin/bash

cleaner(){
        ./date_remove.awk $1 
}

cleaner $1 > "out"

“date_remove.awk”在哪里

代码语言:javascript
复制
#! /usr/bin/awk -f

date = /(^|[^[:alpha:]])[[:digit:]]{2}[[:space:]]{1,}[[:alpha:]]{3,8}[[:space:]]{1,}[[:digit:]]{4}([^[:alpha:]]|$)/ {gsub(date, "")} !date {print}

在这一点上,替代没有发生。“‘gsub”应该只返回匹配的短语,但实际上它不返回任何内容。只是没有匹配的短语被正确地打印出来。在这一点上,我很确定这是一个语法问题,但我不知道在哪里。

输入:

代码语言:javascript
复制
ci sono 4444444444444Quattro mele
sentiamoci         il 16 Ottobre 2018
deciIIIIIIdiamo il 17 ottabre 2017
Manipolo di eroi 55555555555
17       mele
18 ott      2020 llllllLLLLLLLLLLLL
una mela e mezza
2 mAAAeleA
0000 asd a0        0 ad000

实际产出:

代码语言:javascript
复制
ci sono 4444444444444Quattro mele
Manipolo di eroi 55555555555
17       mele
una mela e mezza
2 mAAAeleA
0000 asd a0        0 ad000

预期产出:

代码语言:javascript
复制
ci sono 4444444444444Quattro mele
sentiamoci         il
deciIIIIIIdiamo il 
Manipolo di eroi 55555555555
17       mele
                  llllllLLLLLLLLLLLL
una mela e mezza
2 mAAAeleA
0000 asd a0        0 ad000
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 08:26:49

这是不完全正确的,gsub()不返回它自己匹配的短语。它只返回所做的替换计数。您的问题是如何存储后续字符串替换的匹配组。

您尝试的问题是/../中匹配的regexp没有显式存储,您需要使用match()index()来存储它,并在替换部分中使用它,

代码语言:javascript
复制
awk '
    match($0, /(^|[^[:alpha:]])[[:digit:]]{2}[[:space:]]{1,}[[:alpha:]]{3,8}[[:space:]]{1,}[[:digit:]]{4}([^[:alpha:]]|$)/) {
        str=substr($0, RSTART, RLENGTH); sub(str," ",$0 );
    }1' file

上面的示例将替换捕获的组,即下面的日期字符串,并将它们替换为单个空白。

代码语言:javascript
复制
 16 Ottobre 2018
 17 ottabre 2017
18 ott      2020

根据行中正则表达式出现的次数,可以使用sub()gsub()。应用上面的命令将从文件中移除这些日期字符串,并产生如下结果。

代码语言:javascript
复制
ci sono 4444444444444Quattro mele
sentiamoci         il 
deciIIIIIIdiamo il 
Manipolo di eroi 55555555555
17       mele
 llllllLLLLLLLLLLLL
una mela e mezza
2 mAAAeleA
0000 asd a0        0 ad000

注意在执行字符串替换后的{..}1。在完成适当的替换后,需要重建这条线。

把它放到awk脚本中,它看起来就像

代码语言:javascript
复制
#!/usr/bin/awk -f

match($0, /(^|[^[:alpha:]])[[:digit:]]{2}[[:space:]]{1,}[[:alpha:]]{3,8}[[:space:]]{1,}[[:digit:]]{4}([^[:alpha:]]|$)/) {
    str=substr($0, RSTART, RLENGTH)
    sub(str," ",$0 )
}1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51648541

复制
相关文章

相似问题

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