2011-02-17 2 views
32

, $a 말 :Linux 쉘 스크립트를 사용하여 문자열 내의 문자열 위치를 지정 하시겠습니까? 내가 쉘 변수의 텍스트가있는 경우

나는 "고양이"를 검색 및 리눅스 쉘 스크립트를 사용하여 4 돌아가거나 수있는 방법이 발견되지 않으면 -1
a="The cat sat on the mat" 

?

+0

가능한 중복 (http://stackoverflow.com/questions/229551/string-contains -in-bash) –

+5

@Daniel이 질문은 부분 문자열의 색인도 묻습니다. –

답변

5
echo $a | grep -bo cat | sed 's/:.*$//' 
+0

echo "$ a"이 시도했을 때만 작동했습니다. – Zubair

+0

echo "The cat" grep - 보 고양이 | sed 's/:.*$//' 나에게 일하지 말자. – Zubair

+2

@Zubair - 내 우분투 10.04 상자에 명령이 "4"로 표시됩니다. 그것이 내가 기대하는 것입니다. – qbert220

6

나는에 대한 awk 사용이

a="The cat sat on the mat" 
test="cat" 
awk -v a="$a" -v b="$test" 'BEGIN{print index(a,b)}' 
+1

큰 문자열 (10k +)에 대해서는 작동하지 않습니다. – Zubair

+1

awk는 원래 포스터가 요청한 것을 고려해도 너무 큰 대답을 +1합니다. Howier, 그것을 수정하는 방법이 있습니다 :'awk -v a = "$ a"-v b = "$ test" 'BEGIN {print index (a, b)}'| xargs expr -1 +' – jarno

+0

감사합니다. –

20
당신은 바이트 오프셋 문자열의 일치 부분의 얻을 그렙을 사용할 수 있습니다

: 귀하의 예를 당으로

echo $str | grep -b -o str 

:

[[email protected] ~]$ echo "The cat sat on the mat" | grep -b -o cat 
4:cat 

당신은 단지 첫 번째 부분을 원하는 경우 모자 awk가에 떠들썩한 파티와

echo $str | grep -b -o str | awk 'BEGIN {FS=":"}{print $1}' 
+5

'cut -d : -f1'은 awk를 통해 파이핑하는 것보다 약간 가볍습니다 –

+1

echo "고양이가 매트에 앉았습니다"| grep -b -o mat 이 작동하지 않습니다. – Zubair

+3

@Zubair : define "does not work"- 내 컴퓨터에서 출력이 올바르다. – Cercerilla

48

a="The cat sat on the mat" 
b=cat 
strindex() { 
    x="${1%%$2*}" 
    [[ "$x" = "$1" ]] && echo -1 || echo "${#x}" 
} 
strindex "$a" "$b" # prints 4 
strindex "$a" foo # prints -1 
[문자열 bash는 포함]의
+6

+1 대쉬, 애쉬, ksh, pdksh, zsh에서도 작동합니다. 대쉬와 재는'[ "$ x"= "$ 1"]'을 원하고 pdksh는'x = $ 2; x = "$ {1 %% $ x *}"'그러나. –

+1

redhat bash 2.0에서 작동하지 않습니다. – Zubair

+8

@Zubair, bash 2.0은 10 세이고 2 가지 주요 릴리스가 있습니다 (http://ftp.gnu.org/gnu/bash/). 그것을 업데이트 할 수 있습니까? –

관련 문제