2015-02-24 78 views
0

我想用名称的bash命令创建一个数组。我有这种形式的文件,从一个文件创建一个名称数组

<span class="username js-action-profile-name">@paulburt07</span> 
<span class="username js-action-profile-name">@DavidWBrown7</span> 
<span class="username js-action-profile-name">@MikeLarkan</span> 
<span class="username js-action-profile-name">@WeathermanABC</span> 
<span class="username js-action-profile-name">@JoshHoltTEN</span> 
<span class="username js-action-profile-name">@TonyAuden</span> 
<span class="username js-action-profile-name">@Magdalena_Roze</span> 
<span class="username js-action-profile-name">@janesweather7</span> 
<span class="username js-action-profile-name">@VanessaOHanlon</span> 

我需要一个像

array = ("paulburt07" "DavidWBrown7" "MikeLarkan" "WeathermanABC" "JoshHolTEN" "TonyAuden" "Magdalena_Roze" "janesweahter7" "VansessaOHanlon") 

任何想法的阵列?

+0

我想念他们,现在他们 – 2015-02-24 10:14:42

回答

2

是许多可能的解决方案:

array=($(grep -oP '@\K(.*)(?=<)' file)) 

编辑: 没有太多的解释,grep搜索由正则表达式定义的模式文件。 (见man grep)。 -o只打印匹配,-P说,使用perl-ish正则表达式。

@\K(.*)(?=<)平均:

  • 搜索和匹配@
  • 忘记了比赛\K,(但要记住位置)
  • 比赛蚂蚁串(.*)
  • ,直到发现<

$(command)称为命令替换,array=(...)赋值给数组。

EDIT2 因为你原来的输入可能包含更多的HTML标签,你可以使用HTML解析器,例如:

array=($(perl -Mojo -E 'say $_->text for x(b("filename.html")->slurp)->find(q{span[class~="username"]})->each')) 

将打印任何<span class=username>...</span>的内容在任何HTML,无论它的格式。但对于上述你需要安装Mojolicious

+0

当我键入echo $阵列我只收到名字paulburt07 – 2015-02-24 10:26:47

+0

这是正常行为,@EnricAgudPique。要循环浏览内容,您需要为'$ {array [@]}中的项目说';做回声“$ item”; done'。 – fedorqui 2015-02-24 10:32:23

+0

哦,是的!对不起我的问题 – 2015-02-24 10:33:17

1

它是使用sed和tmp文件非常简单:

#!/bin/bash 

fname=${1:-htmlnames.txt}   # original html file 
tmp=${2:-htmltmp.txt}    # temp file to use 

sed -e 's/.*@//' "$fname" > "$tmp" # remove up to '@' and place in temp 
sed -i 's/[<].*$//' "$tmp"   # remove remainder in place in temp 
namearray=($(<"$tmp"))   # read temp file into array 
rm "$tmp"       # remove temp file 

for i in "${namearray[@]}"; do  # print out to verify 
    printf " %s\n" "$i" 
done 

exit 0 

输出:

alchemy:~/scr/tmp/stack/tmp> bash htmlnames.sh 
paulburt07 
DavidWBrown7 
MikeLarkan 
WeathermanABC 
JoshHoltTEN 
TonyAuden 
Magdalena_Roze 
janesweather7 
VanessaOHanlon 
+0

更好地引用'$ {namearray [@]}',这样就可以正确处理带空格的名称。 – fedorqui 2015-02-24 10:32:59

+1

良好的捕获 - 修复。 – 2015-02-24 10:46:25

+0

也可用于sed – 2015-02-24 10:57:34

相关问题