如何在 bash 中使用‘sed’从特定点删除一行?

如何在 bash 中使用‘sed’从特定点删除一行?

所以我有这些行例如:

名字,姓氏,[电子邮件保护]

姓名2,姓氏2,[电子邮件保护]

我需要删除'[电子邮件保护]' 在每一行中,本质上我想让 sed 对每一行执行“删除从第二个逗号到 .com 的所有内容”。

我知道“s/,.*/”如何工作,但是我如何指定它需要从第二个逗号开始而不是第一个逗号?

这是我需要的结果: name lastname name2 lastname2

希望我已经解释清楚了,英语不是我的母语,所以如果需要的话我会尝试重新措辞我的问题。

预先感谢您的帮助!

答案1

这里有两种不同的方法可以帮你理解 regex 和 sed 的基础:

其中,有 3 个记住的模式,并且仅选择\1和:\2

sed -r 's/^(.+),(.+),(.+)$/\1,\2/g' my_csv.txt

在这一个中,只有两个记住的模式,只有\1选择的模式(以\2第二个逗号开头)

sed -r 's/^(.+)(,[a-z0-9_-][email protected])$/\1/g' my_csv.txt

两种情况的结果都是:

name,lastname
name2,lastname2

现在,应该说,为了完整性,电子邮件的正则表达式必须考虑各种因素(一个例子可以是 Unicode 字符,假设是国际字符)。这里的目标是证明这是可能的(根据您的示例)。


这是一个好的答案关于电子邮件的完整正则表达式。

相关内容