2014-10-10 4 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

이 문자열에 대해 무엇을 알고 :-) anubhava의 솔루션을 선호? 줄 바꿈 구분? 공백으로 구분 된 _only_? ...? –

+0

... 또한 문자열에 비 알파 콘텐츠가 포함되어 있으면 어떻게 될까요? 귀하의 정규식은 숫자가 제외되어야 함을 의미합니다. 그것은 진정한 요구 사항입니까? –

+0

각 줄에 단어와 공백을 넣을 수 있습니다. – user1111929

답변

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

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, Bourne의) <<< 또는 배열이나 (()) 및없이 같은 인자를 취하지 bashisms없이 쉘 솔루션을 외부 프로그램에 값 비싼 포크 - 어떤 현대 쉘 :

#!/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가 포함되어 있으면 경로명 확장에 취약합니다 –

+1

Glenn Jackman이 맞습니다. 그리고 어쨌든 휴대 성이 걱정되는 이유는 무엇입니까? 질문은 분명히 bash로 태그되었습니다. –

+0

@ 글렌 잭맨 : OP 발표 * 참고 : 원래 문자열에는 공백과 글자 만 포함되어 있습니다 *. – Jens

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 

를 포함하지만 심지어 내가

+0

고양이의 쓸모없는 사용; 'wc -w Jens

+0

예, 나쁘다고 생각합니다 .-) –

관련 문제