有条件的gsub动作

时间:2018-08-02 08:02:53

标签: if-statement awk

根据here的答案,我试图再现一个条件语句,在该条件语句中,如果发生匹配,则会发生替换(匹配日期)。如果没有匹配,则按原样打印该行。

#!/bin/bash

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

cleaner $1 > "out"

“ date_remove.awk”在哪里

#! /usr/bin/awk -f

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

此时,替换没有发生。 'gsub'应该只返回匹配的短语,但实际上不返回任何内容。只有不匹配的短语才能正确打印。在这一点上,我很确定这是一个语法问题,但是我不知道在哪里。

输入:

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

实际输出:

ci sono 4444444444444Quattro mele
Manipolo di eroi 55555555555
17       mele
una mela e mezza
2 mAAAeleA
0000 asd a0        0 ad000

预期输出:

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 个答案:

答案 0 :(得分:2)

这不是很正确,gsub()不能单独返回匹配的短语。它只返回替换的次数。您的问题是如何存储匹配组以用于后续字符串替换。

尝试的问题是/../中匹配的正则表达式未显式存储,您需要使用match()index()使其存储并在替换部分中使用它,

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

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

 16 Ottobre 2018
 17 ottabre 2017
18 ott      2020

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

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脚本中

#!/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