2014-10-10 58 views
2

如何選擇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]+' 只產生第一和第三產出,而不是第二產出。

請注意:原始字符串是保證只包含空格和字母

編輯:我需要一個解決方案,我可以事後管道到另一個程序。

+0

你是怎麼看這個字符串的解決方案?換行分隔?空白分隔的_只是_? ...? – 2014-10-10 16:49:19

+0

...另外,如果字符串包含非alpha內容會發生什麼?你的正則表達式意味着應該排除數字;這是一個真正的要求嗎? – 2014-10-10 16:52:00

+0

只是單詞和可能多個空格在它們之間的每一行 – user1111929 2014-10-10 16:52:01

回答

5

使用awk可以這樣做:

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

甚至更​​短:'awk -v RS ='''p {print p,$ 1} {p = $ 1}'<<<「$ s」' – anubhava 2014-10-10 17:27:05

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 
1

純(POSIX,伯恩),而不不可移植bash化等<<<或陣列或(())和無殼溶液昂貴的叉子外部程序 - 作品任何現代外殼:

#!/bin/sh 

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

請注意殼牌的set這個詞是如何輕鬆地工作,並且轉換需要將下一對迭代到位!

+2

如果字符串中包含'*'或其他glob-chars,那麼這對路徑名擴展也很脆弱 – 2014-10-10 18:28:50

+1

Glenn Jackman是正確的。爲什麼要關心不可移植性呢?問題顯然是標記爲bash。 – 2014-10-10 18:30:53

+0

@glennjackman:OP聲明*請注意:原始字符串保證只包含空格和字母*。 – Jens 2014-10-11 08:19:22

0

讓文件FF包含 「測試TET測試tezt」

[email protected] /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的:-)

+0

貓的無用用途; 'wc -w Jens 2014-10-11 08:25:17

+0

是的,我同意它不好:-) – 2014-10-11 09:59:09

相關問題