如何从bash中的两行分隔符中提取文本?

时间:2010-04-08 21:42:24

标签: regex bash

什么是正则表达式我可以用bash编写来解析一行并提取可以在两行之间找到的文本。 (那将是ex:1:|嘿| 2:| boy |)并将这些单词保留在某种数组中?

5 个答案:

答案 0 :(得分:2)

不需要复杂的正则表达式。拆分“|”,然后每个第二个元素都是你想要的

#!/bin/bash
declare -a array
s="|hey| 2: |boy|"
IFS="|"
set -- $s
array=($@)
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

答案 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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在你自己的答案中,你输出最后一对管道之间的内容(假设一条线上有两个以上的管道)。

这将输出第一对之间的内容:

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

这将输出最外层对之间的内容(因此它将显示它们之间出现的管道):

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

答案 4 :(得分: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|'
相关问题