Bash 脚本:检测电子邮件地址后的分隔符,并进行分支

Posted

技术标签:

【中文标题】Bash 脚本:检测电子邮件地址后的分隔符,并进行分支【英文标题】:Bash scripting: detect delimiter after email address, and do branching 【发布时间】:2021-07-19 21:05:50 【问题描述】:

我有一组 txt 文件需要解析并插入 mysql。 在尝试 SQL INSERT 之前,我正在尝试编写一个 bash 脚本来清理数据。

文件通常采用以下格式:

email@address.com:hashed_password

在某些情况下,如上例,分隔符是冒号':'

是的,很好很简单...

但是有些文件使用逗号“,”或分号“;”而是作为分隔符。

嗯,没那么容易。

作为一个更多样化的文件的例子:

email@address.com;hashed_password
email@address.co.uk,hashed_password
email@address.fr,hashed_password

--注意分隔符的不同用法。

我正在尝试编写一个 bash 脚本来检查 txt 文件中的每一行。 对于每一行,脚本应该检测正在使用的分隔符,并相应地调整行。

我决定使用三个冒号作为 SQL 分隔符 ':::'。这是因为许多散列密码包含更多的分隔符。

这是我原来的 bash 脚本:

#!/bin/bash

DIR="/file/path/location"
for file in "$DIR"/*.txt
do
echo "Processing file $file"
sed -i 's/:/:::/' "$file"
echo "Importing to SQL db"
mysql -uroot -p'password' <<EOF
USE collection1;
LOAD DATA LOCAL INFILE '$file' INTO TABLE test_table CHARACTER SET utf8mb4 FIELDS TERMINATED BY ':::' LINES TERMINATED BY '\n';
EOF
echo "Import complete, archiving file..."
sudo mv "$file" processed/
done

第一次尝试适用于文件有冒号分隔符的情况,但当然无法处理使用分号或逗号的文件。

我想我需要一些模式匹配?好吧,好吧,那么让我们陷入困境。

我尝试了一些模式匹配,因为我是新手。我最终得到了这一行:

grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4\b' test_data.txt

是的,这在我的终端中生成了一个很长的电子邮件地址列表:

email@address.net
email@address.com
email@address.fr
etc

好的,但我需要检测这些电子邮件地址后面的分隔符。好吧,我做了一个简单的补充:

grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4\b.0,1' test_data.txt

又一次胜利,这次​​我得到了一个电子邮件地址列表,每行末尾都有分隔符:

email@address.net:
email@address.fr;
email@address.com:
etc

但是,我如何根据分隔符做出决定/分支?采用这种方法,我是否朝着正确的方向前进?

我要做的是:

if [ delimiter=":" ] 
    sed -i 's/:/:::/' "$file"
elif [ delimiter =";" ]
    sed -i 's/;/:::/' "$file"
elif [ delimiter ="," ]
    sed -i 's/,/:::/' "$file"
etc

我希望这是有道理的!非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

为什么要确定分隔符?只允许使用任何一个分隔符。 在这里,我们将每个@ 之后遇到的第一个,/;/: 替换为您的自定义分隔符:::

sed -i -E 's/(@[^,;:]*)[,;:]/\1:::/' "$file"

即使引用时本地部分(@ 之前)can contain ,/,/:,这也是安全的。域部分(在@ 之后)既不能包含,,也不能包含;,也不能包含:。由于我们只看那部分,所以没有问题。

【讨论】:

以上是关于Bash 脚本:检测电子邮件地址后的分隔符,并进行分支的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本检测IP地址

从 Bash 脚本中检测操作系统并通知用户

如果语句过早退出Bash脚本循环

检查SMTP地址是否被检测网站列入黑名单

sh Bash脚本,用于检查网站是启动还是关闭,并通过电子邮件发送通知

do 循环的 Bash 脚本,用于检测经过的时间段然后继续