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