Bash 脚本:检测电子邮件地址后的分隔符,并进行分支
Bash scripting: detect delimiter after email address, and do branching
我有一组 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
第一次尝试在文件有冒号分隔符的情况下奏效,但当然无法处理使用分号或逗号的文件。
我想我需要一些模式匹配?好吧,那我们就开始吧。
我尝试了一些模式匹配,因为我是新手。我结束了这一行:
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
但是,我如何根据分隔符制作 decision/branch?我采用这种方法是否朝着正确的方向前进?
我要做的是:
if [ delimiter=":" ]
sed -i 's/:/:::/' "$file"
elif [ delimiter =";" ]
sed -i 's/;/:::/' "$file"
elif [ delimiter ="," ]
sed -i 's/,/:::/' "$file"
etc
我希望这是有道理的!非常感谢任何帮助。
为什么要确定分隔符?只允许使用任一分隔符。
在这里,我们将每个 @
之后遇到的第一个 ,
/;
/:
替换为您的自定义分隔符 :::
sed -i -E 's/(@[^,;:]*)[,;:]/:::/' "$file"
即使本地部分(在 @
之前)can contain ,
/,
/:
被引用时也是安全的。域部分(在 @
之后)既不能包含 ,
也不能包含 ;
,也不能包含 :
。由于我们只看那部分,所以没有问题。
我有一组 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
第一次尝试在文件有冒号分隔符的情况下奏效,但当然无法处理使用分号或逗号的文件。
我想我需要一些模式匹配?好吧,那我们就开始吧。
我尝试了一些模式匹配,因为我是新手。我结束了这一行:
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
但是,我如何根据分隔符制作 decision/branch?我采用这种方法是否朝着正确的方向前进?
我要做的是:
if [ delimiter=":" ]
sed -i 's/:/:::/' "$file"
elif [ delimiter =";" ]
sed -i 's/;/:::/' "$file"
elif [ delimiter ="," ]
sed -i 's/,/:::/' "$file"
etc
我希望这是有道理的!非常感谢任何帮助。
为什么要确定分隔符?只允许使用任一分隔符。
在这里,我们将每个 @
之后遇到的第一个 ,
/;
/:
替换为您的自定义分隔符 :::
sed -i -E 's/(@[^,;:]*)[,;:]/:::/' "$file"
即使本地部分(在 @
之前)can contain ,
/,
/:
被引用时也是安全的。域部分(在 @
之后)既不能包含 ,
也不能包含 ;
,也不能包含 :
。由于我们只看那部分,所以没有问题。