If statement 条件gsub动作

If statement 条件gsub动作,if-statement,awk,If Statement,Awk,根据答案,我试图复制一个条件语句,在匹配的情况下,替换发生(它匹配日期)。如果不匹配,则按原样打印该行 #!/bin/bash cleaner(){ ./date_remove.awk $1 } cleaner $1 > "out" “date\u remove.awk”在哪里 #! /usr/bin/awk -f date = /(^|[^[:alpha:]])[[:digit:]]{2}[[:space:]]{1,}[[:alpha:]]{3,8}[[:spa

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

#!/bin/bash

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

cleaner $1 > "out"
“date\u 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

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

您尝试的问题是,
/../
中匹配的regexp未显式存储,您需要使用
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

请您也提供输入和输出的样本,这样问题就更清楚了。“awk”似乎比预期的要深刻和复杂得多。无论如何,谢谢你的回答。这是正确的和尖锐的。更重要的是,它让我意识到有必要花时间学习“awk”及其背景机制。@Worice:这是一门美丽的语言,确实值得花时间学习。
/pattern/{action}
是Unix中可用的漂亮东西之一!