Regex Bash脚本:检测电子邮件地址后的分隔符,并执行分支
我有一组txt文件需要解析并插入MySQL。 在尝试SQL插入之前,我试图编写一个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
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"