首页 > 解决方案 > 在 bash 中使用正则表达式过滤文件中的数据

问题描述

我喜欢创建批处理脚本,该脚本将对从文件中提取的变量执行一些任务。

我试图找到一些正则表达式,或者说多个正则表达式,因为我需要很少的变量。

我在 bash 中读取了具有以下内容的文件:

username [mutiple spaces] = User Name [mutiple spaces] <u.name@domain.com>

我喜欢做的是:
- 获取用户名:'用户名'
- 获取全名:'用户名'
- 获取电子邮件:'u.name@domain.com'

如上所述,我尝试将所有详细信息分成多个(三个) 变量
我现在拥有的是:

input="svn_usernames.txt"
while IFS= read -r line
do
  #USERNAME=$(echo "$line" | awk '{print $1}')
  #echo $USERNAME
  echo "$line" | perl -pe '/\s\s+/g and / /g'
done < "$input"

标签: regexbash

解决方案


好的,我会做一些假设。

1) There WILL be spaces before *AND* after the equals
2) "username" is a login id
3) the user's actual name might have multiple fields - given name, surname, etc.
4) the email is JUST the email inside angle brackets.

有了这些,

input="svn_usernames.txt"
while read -a line && (( ${#line[@]} )) # while can read a row
do username="${line[0]}"                # assign 1st to username
   email="${line[-1]//[<>]/}"           # last to email w/o <>
   name="${line[@]:2:$(( ${#line[@]} - 3 ))}" # all between to name
   echo "username:[$username] name=[$name] email=[$email]"
done < "$input"

推荐阅读