根据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
答案 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