在bash中提取多个子字符串

时间:2012-08-16 14:43:13

标签: string bash shell sed

我有一个从wiki导出的页面,我想使用bash找到该页面上的所有链接。该页面上的所有链接均采用[wiki:<page_name>]格式。我有一个脚本:

...
# First search for the links to the pages                                                                                                                                    
search=`grep '\[wiki:' pages/*`

# Check is our search turned up anything                                                                                                                                     
if [ -n "$search" ]; then
    # Now, we want to cut out the page name and find unique listings                                                                                                         
    uniquePages=`echo "$search" | cut -d'[' -f 2 | cut -d']' -f 1 | cut -d':' -f2 | cut -d' ' -f 1 | sort -u`
....

然而,当出现带有多个[wiki:文本的grep结果时,它只会拉出最后一个而不是其他任何文本。例如,如果$search是:

  

在开始配置之前,必须安装所有必需的库以供Cmake检测。如果您错过了这一步,请参阅[wiki:CT / Checklist / Libraries“Libr按[t]可以切换到高级模式屏幕,其中包含更多详细信息。这5页可用[wiki:CT / Checklist / Cmake / advanced_mode在这里获取有关ea的信息 - ''''Cantera'''的安装:如果没有正确安装Cantera,或者如果你没有找到安装文件''〜/ setup_cantera''',你应该收到以下信息请参阅[wiki:CT / FormulationCantera“Cantera安装”]页面来解决此问题。如果您打算使用内置传输,热力学和化学,可以将Cantera选项设置为OFF。

然后它只返回CT/FormulationCantera并且它不会给我任何其他链接。我知道这是因为使用cut所以我需要替换$uniquepages行。

有人在bash中有任何建议吗?如果需要,它可以使用sed或perl,但是我希望如果可能的话,我会希望单行提取页面列表列表。

1 个答案:

答案 0 :(得分:2)

egrep -o '\[wiki:[^]]*]' pages/* | sed 's/\[wiki://;s/]//' | sort -u

UPD。删除没有cut

的所有后续空格
egrep -o '\[wiki:[^]]*]' pages/* | sed 's/\[wiki://;s/]//;s/ .*//' | sort -u
相关问题