如何匹配包含*仅*四位数的行并删除两个正则表达式匹配之间的行?

时间:2014-06-17 22:52:32

标签: regex awk

我需要处理一个由以下记录组成的文件:

5145
Xibraltar: vista xeral do Peñón
1934, xaneiro, 1 a 1934, decembro, 31
-----FOT-5011--
Nota a data: extraída do listado de compra.
5146
Xixón: a praia de San Lorenzo desde o balneario
ca.1920-1930
-----FOT-3496--
5147
Xixón: balneario e praia de San Lorenzo
ca.1920-1930
Tipos de unidades de instalación: FOT:FOT
-----FOT-3493--

我需要删除1到4位数的记录号(即:5145)以及任何注释,例如“Nota a data:extraídadolistado de compra”,这些记录总是在记录结束后,签名后( - ---- FOT-xxxx--)和下一个记录的记录号之前。

我一直在尝试编写一个awk程序来执行此操作,但我似乎根本无法掌握awk的语法或正则表达式。

这是我尝试匹配记录号码,这些号码仅包含1到4位数字。 (我想我错过了“唯一”部分)。

$ gawk '!/[[:digit:]]{1,4}/ { print $0 }' myUTF8file.txt

另外,我可以匹配这些(记录签名):

$ gawk '/-----FOT-[[:digit:]]{4}--/ { print $0 }' myUTF8file.txt
-----FOT-3411--
-----FOT-3406--
-----FOT-3397--
-----FOT-3412--
...

但我不知道如何删除这些和记录号之间的行。

请原谅我的英语和我重复使用的单词记录,我知道这可能会让人感到困惑。

2 个答案:

答案 0 :(得分:2)

一个小状态机:

awk '
    p {print} 
    /^[[:digit:]]{4}$/ {p=1} 
    /^-----FOT-[[:digit:]]{4}--$/ {p=0}
' file

p变量为真时打印一行:在看到4位数行后打开打印,看到" FOT"线。

答案 1 :(得分:1)

如果音符行始终以字符串" Nota" (并没有其他行开始)然后这将有效。

awk '
  /^[0-9]{1,4}$/ {next}
  /^Nota /       {next}
  1
' file

你的正则表达式有两种错误:

  1. 您撰写了{1-4}而不是{1,4}
  2. 您没有使用开始和结束锚点,只有在匹配时才匹配 那个号码是唯一的就行了。所以即使有正确的 如果有1到4位数字,它将匹配量词 任何地方就行了。
  3. 上面awk脚本中的1是一个始终为true的模式,因此它会导致执行默认操作(打印记录)。