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

Regex 在bash中选择字符串中的所有单词对,regex,bash,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]+' 只产生第一个和第三个输出,而不是第二个输出 请注意:原始字符串保证只包含空格和字母 编辑:我需要一个解决方案,以后可以通过管道传输到另一个程序。使用单词数组

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

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

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

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

编辑:我需要一个解决方案,以后可以通过管道传输到另一个程序。

使用单词数组:

#!/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
#/bin/bash
string='test tet test tezt'

使用
awk
阅读-a单词-d',您可以执行以下操作:

s='test tet test tezt'
awk -v RS=' ' 'NR>1{print p, $1} {p=$1}' <<< "$s"
test tet
tet test
test tezt
s='test tet test tezt'
awk-v RS=''NR>1{print p,$1}{p=$1}'纯(POSIX,Bourne)shell解决方案,没有不可移植的bashism,比如
让文件ff包含“test-tet-test-tezt”

armathew@3NJ2VQ1/cygdrive/d
$list=(`cat ff`);元素=`cat ff|wc-w`;对于((i=0;i<$[$elems-1];i++);do echo${list[$i]}${list[$i+1]};完成;
测试测试
测试
试验台

但即使是我也更喜欢阿努巴瓦的解决方案:-)

你对这根弦了解多少?新线分离?仅分隔的空白。。。?。。。另外,如果字符串包含非alpha内容,会发生什么情况?您的正则表达式意味着应该排除数字;这是一个真正的要求吗?在每行或更短的行上,它们之间只有单词和(可能有多个)空格:
awk-v RS='''p{print p,$1}{p=$1}',如果字符串包含
*
或其他glob charsGlenn Jackman是正确的,它也容易受到路径名扩展的攻击。为什么要关心不可移植性呢?问题被清楚地标记为bash。@glennjackman:OP声明请注意:原始字符串保证只包含空格和字母。@gniourf_gniourf,因为可移植性是正确编程的标志。你不能过早地告诉用户,世界上所有的bash/Linux/i86都将很快对他们产生影响。:-)猫的无用使用<代码>wc-w
。但是为这样一个简单的任务分叉/执行三个过程?是的,我同意这是不好的:-)
#!/bin/sh

s='test tet test tezt'
set -- $s
while test $# -gt 1; do
   printf '%s %s\n' $1 $2
   shift
done
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