如何使用sed格式化文件 适配导入电子表格的格式要求
sed格式化文件实现方案
针对你需要将项目名+关联邮箱逐行转换为项目ID | 邮箱1 | 邮箱2...格式的需求,以下是两种高效的单命令实现方案:
方案1:单行sed命令
sed -n '/@/!{x;s/\n/ | /g;p;d;};H;${x;s/\n/ | /g;p}' input.txt | sed '1d'
命令说明:
- 匹配不带
@的项目名行时,交换暂存区与模式空间内容,将暂存区中之前存储的项目+邮箱的换行分隔符替换为|后输出,再将当前新项目名存入暂存区 - 匹配带
@的邮箱行时,直接追加到暂存区存储 - 全部行处理完成后输出最后一个项目的内容,最后删掉首行空内容即可得到目标格式
方案2:awk实现(更适合大文件场景,执行效率更高)
awk '/@/{o=o" | "$0;next} {if(o!="")print o;o=$0} END{print o}' input.txt
命令说明:
- 匹配到邮箱行时,直接拼接至当前项目的输出变量中,用
|分隔 - 匹配到项目名行时,先输出上一个项目的拼接结果,再将当前项目名赋值给输出变量
- 遍历结束后输出最后一个项目的内容,无需二次管道处理
效果验证
用你提供的输入文件执行上述任意命令,均可直接得到目标输出:
projectA | email1@demo.com | Email2@test.com | email3@demoA.com TestB | testUser@demo.com | email4@test.com ProjectC | email1@demo.com
如果存在项目名包含@的特殊场景,可将命令中的@匹配规则替换为标准邮箱正则/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/即可避免误判。
内容的提问来源于stack exchange,提问作者Kristin Brotherton
相关产品推荐
相关产品推荐

