변수에 대한 grep 봅시다 line=”This is

변수가 있다고 가정 해 봅시다

line="This is where we select from a table."

이제 문장에서 몇 번이나 선택이 발생하는지 grep하고 싶습니다.

grep -ci "select" $line

나는 그것을 시도했지만 작동하지 않았다. 나는 또한 시도했다

grep -ci "select" "$line"

여전히 작동하지 않습니다. 다음과 같은 오류가 발생합니다.

grep: This is where we select from a table.: No such file or directory


답변

적이 grep표준 입력에서 읽을. 파이프를 사용하여 간다 …

$ echo "$line" | grep select

… 또는 here 문자열

$ grep select <<< "$line"

또한 grepping하기 전에 공백을 줄 바꿈으로 바꾸고 싶을 수도 있습니다.

$ echo "$line" | tr ' ' '\n' | grep select

… 또는 grep일치하는 내용 만 인쇄 하도록 요청할 수 있습니다.

$ echo "$line" | grep -o select

일치하는 항목이 있으면 나머지 줄을 제거 할 수 있습니다.

편집 : 죄송합니다 . Marco에게 감사 합니다. 발생 횟수를 계산하려면이 중 하나를 wc(1);)로 파이프하십시오 .

또 다른 편집 이후 lzkata 인용의 코멘트를 $line사용하는 경우 echo.


답변

test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done

grep그런 간단한 것을 요구할 필요는 없습니다 .

또는 기능으로 :

occur() while case "$1" in (*"$2"*) set -- \
        "${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
        (*) return "$((${4:-0}<${3:-1}))";;esac
        do : "${_occur:+$((_occur=$4))}";done

2 개 또는 3 개의 인수가 필요합니다. 그 이상을 제공하면 결과가 왜곡됩니다. 다음과 같이 사용할 수 있습니다.

_occur=0; occur ... . 2 && echo "count: $_occur"

…의 발생 횟수 출력되는 .하여 ...이 적어도 2 회 발생한 경우. 이처럼 :

count: 3

경우 $_occur중 하나 비어 있거나 unset이 호출 될 때 그것은 전혀 쉘 변수에 영향을 미치지 것이다 return경우 1 "$2"에서 발생 "$1"보다 더 적은 "$3"시간. 또는 두 개의 인수로만 호출 return하면 "$2"에없는 경우에만 1이됩니다 "$1". 그렇지 않으면 0을 반환합니다.

따라서 가장 간단한 형태로 다음을 수행 할 수 있습니다.

occur '' . && echo yay || echo shite

… 인쇄 …

shite

…그러나…

occur . . && echo yay || echo shite

… 인쇄 할 것이다 …

yay

또한 약간 다르게 작성 $2하고 (*"$2"*)and "${1#*"$2"}"문 에서 따옴표를 생략 할 수도 있습니다 . 그렇게 sh[io]te하면 일치 테스트 와 같은 일치에 쉘 글롭을 사용할 수 있습니다 .