用于上传到工作表的正则表达式/sed 格式设置帮助



您好,我正在寻找有关如何使用 sed 格式化文件的帮助。

我有一个生成的文件,如下所示:

projectA
email1@demo.com
Email2@test.com
email3@demoA.com
TestB
testUser@demo.com
email4@test.com
ProjectC
email1@demo.com

我正在使用 sed 格式,但我知道有一种更简单的方法可以解决这个问题,而不是运行几个 sed 命令。

我希望格式在工作表中看起来像这样:

ProjectID1 | Email1 | Email2 | ...
ProjectID2 | Email1 | Email2 | Email3 | ...
ProjectID3 | Email1 | ...

我会使用 GNUAWK来完成这个任务,让file.txt内容

projectA
email1@demo.com
Email2@test.com
email3@demoA.com
TestB
testUser@demo.com
email4@test.com
ProjectC
email1@demo.com

然后

awk 'NR>1{printf /@/?" | ":"n"}{printf $0}' file.txt

输出

projectA | email1@demo.com | Email2@test.com | email3@demoA.com
TestB | testUser@demo.com | email4@test.com
ProjectC | email1@demo.com

假设:任何地方@的每一行都是电子邮件,每隔一行都是项目 ID。

说明:我使用printf,因为它不会在末尾添加换行符。在除第一行之外的所有行之前,我printf|或换行符(n),具体取决于它是邮件行还是其他行,我使用三元运算符(条件?值如果真:值iffalse)根据行是否包含@进行选择。对于我printf的每一行。注意:我的代码生成没有尾随换行符的输出,如果您确实需要,请在{printf $0}后面添加END{print ""}

(在Gawk 4.2.1中测试)

这可能对你有用(GNU sed):

sed -E ':a;N;s/n(.*@)/ | 1/;ta;P;D' file

收集行,按|替换不是电子邮件地址的行和作为电子邮件地址的行之间的换行符。

最新更新