변수가 있다고 가정 해 봅시다
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
하면 일치 테스트 와 같은 일치에 쉘 글롭을 사용할 수 있습니다 .