2010-04-08 41 views
2

什麼是正則表達式,我可以寫在bash中解析一行並提取可以在兩行之間找到的文本| (這樣會是:ex:1:| hey | 2:| boy |),並將這些單詞保存在某種數組中?如何從bash中的一行中的兩個分隔符之間提取文本?

+0

就是你們的榜樣「前:1:|哎| 2: |男孩|」一個樣本LINE解析或解析一行的結果?如果是後者,那麼會產生這些結果的樣本線是什麼? 我可以考慮一些方法,但它們取決於你的輸入是什麼樣子,哪種方法是「最好的」取決於你接下來用「數組」來做什麼。 – 2010-04-08 22:01:19

+0

該示例是一個示例LINE。實際上這個例子可以用新的方式。 – syker 2010-04-08 22:02:32

+0

我想要做的就是隻打印出一個特殊的格式化的順序(就像在兩者之間說逗號)並對其進行排序 – syker 2010-04-08 22:03:09

回答

2

不需要複雜的正則表達式。 「|」 上拆分,然後每第二個元素是你

#!/bin/bash 
declare -a array 
s="|hey| 2: |boy|" 
IFS="|" 
set -- $s 
array=([email protected]) 
for((i=1;i<=${#array[@]};i+=2)) 
do 
echo ${array[$i]} 
done 

輸出

$ ./shell.sh 
hey 
boy 

用awk想要什麼

$ echo s="|hey| 2: |boy|" | awk -F"|" '{for(i=2;i<=NF;i+=2)print $i}' 
hey 
boy 
+0

+1很好的使用IFS,set和()。但是,如果左右分隔符不同(例如,'<' and '>')並且順序有意義,或者分隔符是多字符(例如「 - 」),則此方法將不起作用。正則表達式的方法更一般/靈活,恕我直言。 – 2010-04-09 03:59:58

+0

使它更加靈活也不難。直到OP所要求的,它將保持原樣。 – ghostdog74 2010-04-09 04:17:43

0

使用sed -e 's,.*|\(.*\)|.*,\1,'

1
$ foundall=$(echo '1: |hey| 2: |boy|' | sed -e 's/[^|]*|\([^|]\+\)|/\1 /g') 
$ echo $foundall 
hey boy 
$ for each in ${foundall} 
> do 
> echo ${each} 
> done 
hey 
boy 
0

在你自己的答案,你輸出的最後一對管(假設有一個上線兩個以上的管道)之間有什麼。

這將輸出的第一對之間有什麼:

sed -e 's,[^|]*|\([^|]*\)|.*,\1,' 

這將輸出最外面的一間什麼(所以這將表明他們之間出現管道):

sed -e 's,[^|]*|\(.*\)|.*,\1,' 
0
#!/bin/bash 

_str="ex: 1: |hey| 2: |boy|" 
_re='(\|[^|]*\|)(.*)' # in group 1 collect 1st occurrence of '|stuff|'; 
         # in group 2 collect remainder of line. 

while [[ -n $_str ]];do 
    [[ $_str =~ $_re ]] 
    [[ -n ${BASH_REMATCH[1]} ]] && echo "Next token is '${BASH_REMATCH[1]}'" 
    _str=${BASH_REMATCH[2]} 
done 

產量

Next token is '|hey|' 
Next token is '|boy|' 
相關問題