根据this的答案,我试图复制一个条件语句,在匹配的情况下,会发生替换(它匹配日期)。如果没有匹配,则按原样打印行。
#!/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发布于 2018-08-02 08:26:49
这是不完全正确的,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 )
}1https://stackoverflow.com/questions/51648541
复制相似问题