在bash中选择字符串中的所有单词对

时间:2014-10-10 16:41:56

标签: regex bash

如何在bash中选择文本中的所有后续单词?

例如,字符串test tet test tezt应转换为

test tet
tet test
test tezt

我尝试过使用正则表达式,但是只有匹配的一半,因为匹配器从它停止的地方开始,例如, echo "test tet test tezt" | grep -Po '[a-zA-Z]+ [a-zA-Z]+' 只产生第一个和第三个输出,而不是第二个输出。

请注意:原始字符串保证只包含空格和字母

编辑:我需要一个解决方案,然后我可以将其导入另一个程序。

4 个答案:

答案 0 :(得分:5)

使用awk即可:

s='test tet test tezt'
awk -v RS=' ' 'NR>1{print p, $1} {p=$1}' <<< "$s"
test tet
tet test
test tezt

答案 1 :(得分:3)

使用单词数组:

#!/bin/bash
string='test tet test tezt'
read -a words -d '' <<< "$string"
for (( i=1; i<${#words[@]}; i++ )); do
    echo "${words[i-1]} ${words[i]}"
done

答案 2 :(得分:1)

纯粹的(POSIX,Bourne)shell解决方案,没有像<<<或数组或(( ))那样的不可移植的基本原理,并且没有昂贵的外部程序分支 - 适用于任何现代shell :

#!/bin/sh

s='test tet test tezt'
set -- $s
while test $# -gt 1; do
   printf '%s %s\n' $1 $2
   shift
done

请注意shell与set分开的单词是否有效,并且移位负责将下一对迭代到位!

答案 3 :(得分:0)

让文件ff包含“test tet test tezt”

armathew@3NJ2VQ1 /cygdrive/d
$ list=(`cat ff`); elems=`cat ff | wc -w`; for ((i = 0; i < $[ $elems - 1 ]; i++)); do echo ${list[$i]} ${list[$i + 1]}; done;

test tet
tet test
test tezt

但即使我更喜欢anubhava的解决方案: - )