如何用Bash筛选文本条目并处理为指定格式的数组
解决方法
你可以通过结合grep和sed(或者更简洁的awk)来实现需求,下面提供两种可行的方案:
方案1:grep + sed组合
这个方案先筛选符合条件的行,再调整格式,逻辑清晰:
foo=( $(grep -E '","(G2|Y5)' clients | sed -E 's/"//g; s/^[^,]+,([^,]+),(.+)/\1 (\2)/') )
分步解释:
- grep筛选行:
grep -E '","(G2|Y5)' clients-E启用扩展正则,确保能匹配G2或Y5","(G2|Y5)精准匹配第二列包含G2/Y5的行,避免误匹配其他列的内容
- sed调整格式:
sed -E 's/"//g; s/^[^,]+,([^,]+),(.+)/\1 (\2)/'s/"//g:移除所有双引号s/^[^,]+,([^,]+),(.+)/\1 (\2)/:用正则捕获第二列和第三列,替换成第二列 (第三列)的格式
方案2:awk一步完成
awk可以直接按列处理,效率更高,适合数据量较大的场景:
foo=( $(awk -F'","' '$2 ~ /G2|Y5/ {gsub(/"/, "", $3); printf "%s (%s) ", $2, $3}' clients) )
分步解释:
-F'","':把每行按","作为分隔符拆分,这样原行的三个字段会被拆分为$1="1、$2=USERID、$3=ACCESSCODE"$2 ~ /G2|Y5/:只处理第二列包含G2或Y5的行gsub(/"/, "", $3):移除第三列末尾的双引号printf "%s (%s) ", $2, $3:按要求格式输出内容,每个元素后加空格,确保存入数组时自动拆分
验证结果
你可以通过以下命令查看数组内容:
for item in "${foo[@]}"; do echo "$item" done
输出应该和你期望的一致:
G2567u (54564df76786470976476987w) Y5po97 (iuioubhjgjg768b79j9890980)
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

