如何在bash中选择文本中的所有后续单词?
例如,字符串test tet test tezt
应转换为
test tet
tet test
test tezt
我尝试过使用正则表达式,但是只有匹配的一半,因为匹配器从它停止的地方开始,例如, echo "test tet test tezt" | grep -Po '[a-zA-Z]+ [a-zA-Z]+'
只产生第一个和第三个输出,而不是第二个输出。
请注意:原始字符串保证只包含空格和字母
编辑:我需要一个解决方案,然后我可以将其导入另一个程序。
答案 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的解决方案: - )