![如何从文件中仅删除特定字段中的电子邮件地址?](https://linux22.com/image/160966/%E5%A6%82%E4%BD%95%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E4%BB%85%E5%88%A0%E9%99%A4%E7%89%B9%E5%AE%9A%E5%AD%97%E6%AE%B5%E4%B8%AD%E7%9A%84%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E5%9C%B0%E5%9D%80%EF%BC%9F.png)
我试图仅删除第七个字段中的电子邮件地址。我尝试通过 sed 执行此操作,但我无法选择/选择我想要删除的 col。我想删除第七个字段中出现的所有电子邮件地址。
输入文件:
980||||||[email protected]||77880|GB||0CA005D||
7980||||||[email protected]||5656|PO||69B88008BE||
100||||||[email protected]||31000|USA||0C5D||
101||||||||3100df0|CAN||0C5D||
570||||||[email protected]||5521123|RSA||B70F2||
080570||||||[email protected]||AV6777|OI||A005D||
1870||||||USA||5521123|RSA||B70F2||
70||||||RABBIT||AV6777|OI||A005D||
输出:
980||||||||77880|GB||0CA005D||
7980||||||||5656|PO||69B88008BE||
100||||||||31000|USA||0C5D||
101||||||||3100df0|CAN||0C5D||
570||||||||5521123|RSA||B70F2||
080570||||||||AV6777|OI||A005D||
1870||||||USA||5521123|RSA||B70F2||
70||||||RABBIT||AV6777|OI||A005D||
这就是我试图达到的结果,但我无法达到目标。
sed 's/,[a-z][0-9]\@[a-z][0-9]\.[a-z]//' file
答案1
(在问题中添加更多要求后编辑了脚本。)
awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } { print }' file
解释:
-F '|' -v OFS='|'
设置输入和输出字段分隔符
$7 ~ /@/
条件:第 7 列包含@
{ $7 = "" }
操作:将第 7 列设置为空字符串
{ print }
无条件操作:打印该行
该脚本假设第 7 列中包含 a 的所有内容@
都是电子邮件地址,并且没有不属于该电子邮件地址的其他数据。
正如 Valentin Bajrami 的评论中所述,您可以省略该print
语句并添加另一个包含 only 的规则1
,这是一个1
具有隐式默认操作的“始终为真”条件 ( ) print
。
awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } 1' file
注意:与问题的(编辑的)示例输出相比,脚本不会删除示例输入最后一行中的前导空白。
答案2
尝试这个。
awk -F\| -vOFS=\| '$7="";1'
答案3
使用简化的电子邮件正则表达式将第 6 次出现的|
plus 可选电子邮件地址替换为|
(使第 7 个字段中的非电子邮件地址保持不变):
sed 's/|\([^|@]\+@[^|@]\+\.[a-zA-Z]\{2,\}\)\?/|/6' file
s/
代替|
匹配字面量|
\(
开始组[^|@]\+
匹配一个或多个非|
和非@
字符( 之前的所有字符@
)@
匹配字面量@
[^|@]\+
与上面两行相同\.
匹配一个点[a-zA-Z]\{2,\}
匹配 2 个或更多字母\)
端基\?
匹配零个或一组/|/
用。。。来代替|
6
匹配第 6 次出现的模式