使用命令行查找&替换(组织)?

时间:2014-12-28 17:24:02

标签: regex shell command-line

我有一个巨大的txt文件,其组织方式如下:

Test User</b></a>&nbsp;</td>
user@hotmail.com</a></td>
04-17-2012</span></td>
02-13-2013</span></td>
Another Test</b></a>&nbsp;</td>
fake@spam4.me</a></td>
11-06-2011</span></td>
11-09-2012</span></td>
Username123</b></a>&nbsp;</td>
email@test.com</a></td>
06-07-2011</span></td>
06-03-2013</span></td>
AdminTest</b></a>&nbsp;</td>
testing@gmail.com</a></td>
05-01-2012</span></td>
06-05-2014</span></td>

以下是我希望列表实际显示的方式:

Test User,user@hotmail.com,04-17-2012,02-13-2013
Another Test,fake@spam4.me,11-06-2011,11-09-2012
Username123,email@test.com,06-07-2011,06-03-2013
AdminTest,testing@gmail.com,05-01-2012,06-05-2014

有没有简单的方法可以通过命令行执行此操作,还是应该尝试使用其他路径?

2 个答案:

答案 0 :(得分:0)

使用awk即可:

awk -v OFS=, '{sub(/<.*$/, "")} NR%4==1{a=$1} NR%4==2{b=$1} NR%4==3{c=$1}
    NR%4==0{print a, b, c, $1}' file
Test,user@hotmail.com,04-17-2012,02-13-2013
Another,fake@spam4.me,11-06-2011,11-09-2012
Username123,email@test.com,06-07-2011,06-03-2013
AdminTest,testing@gmail.com,05-01-2012,06-05-2014
  • sub命令删除数据后的所有HTML标记
  • 使用modulo数学,它从4个连续行中获取4个值
  • NR%4==0打印所有值时。

答案 1 :(得分:0)

步骤1是删除XML-ish end-tag垃圾。那可能是:

sed 's/<.*//'

第2步是将相关行收集到一个。为此,我使用awk。一个问题是有多少行构成一个条目。总是只有两个日期,还是可以有一个变数?新条目总是以大写字母开头,还是我们应该假设任何字母?用户名是否以数字开头?

假设带有大写字母的行开始一个新条目,那么这会在用户名行后面累积任意数量的电子邮件地址行和日期行:

awk '/^[A-Z]/ { if (line != "") print line; line = $0; next }
              { line = line "," $0 }
     END      { if (line != "") print line }'

虽然运行两个命令有点麻烦,但我们可以通过以下方式获取awk来清理其输入:

awk '         { sub(/<.*/, "") }
     /^[A-Z]/ { if (line != "") print line; line = $0; next }
              { line = line "," $0 }
     END      { if (line != "") print line }'

如果分隔输入行块的条件不同(键不是主要大写字母),则可以相应地更改代码。

相关问题