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

Regex Bash脚本:检测电子邮件地址后的分隔符,并执行分支,regex,bash,awk,sed,scripting,Regex,Bash,Awk,Sed,Scripting,我有一组txt文件需要解析并插入MySQL。 在尝试SQL插入之前,我试图编写一个bash脚本来清理数据 文件的格式通常为: email@address.com:hashed_password 在某些情况下,如上例所示,分隔符是冒号“:” 耶,很好很简单 但是,有些文件使用逗号“,”或分号“;”作为分隔符 嗯,没那么容易 作为更多样化文件的示例: email@address.com;hashed_password email@address.co.uk,hashed_password

我有一组txt文件需要解析并插入MySQL。 在尝试SQL插入之前,我试图编写一个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
是的,这在我的终端中产生了一个很长的电子邮件地址列表:

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

我希望这是有意义的!非常感谢您的帮助。

为什么要麻烦确定分隔符?只允许任何一个分隔符。
这里我们替换第一个
/
/
我们在每次使用自定义分隔符
@
后都会遇到

sed -i -E 's/(@[^,;:]*)[,;:]/\1:::/' "$file"
这是安全的,即使引用时本地部分(在
@
之前)。域部分(在
@
之后)不能包含
,或
。因为我们只看这一部分,所以没有问题

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