我是使用bash和grep的新手...我正在尝试从包含以下行的TXT文件中输出CSV文件:
输入:
1. Fisrt - Name: Joanna Last - Name: Yang
Place of birth: Paris Date of birth: 01/01/1972 Sex: F
Number: 0009876541234567
2. Fisrt - Name: Bob Last - Name: Lee
Place of birth: London Date of birth: 05/08/1969 Sex: M
Number: 0005671890765223
输出:
"Joanna","Yang","Paris","01/01/1972","F","0009876541234567"
"Bob","Lee","London","05/08/1969","M","0005671890765223"
任何建议将不胜感激!!!!
答案 0 :(得分:1)
仅使用一个带有grep的正则表达式并不容易。
您可以尝试使用多个正则表达式并合并结果。
例如:
要获取名,您可以使用以下正则表达式:"Fisrt - Name: ([a-zA-Z]+)"
。
将其保存到变量中。
接下来要获取生日,您可以使用"birth: ([0-9]+\/[0-9]+\/+[0-9]+)"
。
将其保存到变量中。
对每个部分执行此操作,并用逗号将结果连接起来。
这显然不是最好的方法,但这是一个开始。 为了帮助使用正则表达式,您可以使用https://regex101.com/。
也许尝试使用sed command line
答案 1 :(得分:0)
如果您的文件格式很好并且格式很好,则不需要正则表达式。
我们一次可以读取三行,并在空格处分割它们-我们仅对指定的字段感兴趣。如果您可以“断言”文件中的任何字段都不包含空格(我认为其中没有有效的人名...)?,您可以这样做:
while
IFS=' ' read -r _ _ _ _ name _ _ _ last &&
IFS=' ' read -r _ _ _ birthplace _ _ _ birthdate _ sex &&
IFS=' ' read -r _ number
do
printf '"%s","%s","%s","%s","%s","%s"\n' \
"$name" "$last" "$birthplace" "$birthdate" "$sex" "$number"
done <input
可通过onlinedbg获得实时版本。
答案 2 :(得分:0)
一行:
~ $ cat yourfile.txt
1. Fisrt - Name: Joanna Last - Name: Yang
Place of birth: Paris Date of birth: 01/01/1972 Sex: F
Number: 0009876541234567
2. Fisrt - Name: Bob Last - Name: Lee
Place of birth: London Date of birth: 05/08/1969 Sex: M
Number: 0005671890765223
~ $ sed -r "s/^.*Fisrt - Name: (.*) Last - Name: (.*)$/\1,\2;/g" yourfile.txt | sed -r "s/^Place of birth: (.*) Date of birth: (.*) Sex: (.*)$/\1,\2,\3;/g" | sed -r "s/^Number: (.*)$/\1/g" | sed -n 'H;${x;s/;\n/,/g;s/^,//;p;}' | tail -n +2 > yourfile.csv
~ $ cat yourfile.csv
Joanna,Yang,Paris,01/01/1972,F,0009876541234567
Bob,Lee,London,05/08/1969,M,0005671890765223
~ $
希望有帮助。