문자열에서 문자의 위치를 확인해야 합니다.
예를 들어 문자열은 입니다 RAMSITALSKHMAN|1223333
.
grep -n '[^a-zA-Z0-9\$\~\%\#\^]'
|
주어진 문자열에서 위치를 찾는 방법은 무엇입니까 ?
답변1
-b
단순 텍스트에 대해 동일한 위치에 있는 바이트 오프셋을 얻는 데 사용할 수 있습니다 (UTF-8 또는 유사한 텍스트에는 해당되지 않음).
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|'
14:|
위에서는 -a
스위치를 사용하여 바이너리 파일에서 작업할 때 입력을 텍스트로 사용하고 -o
일치하는 문자만 출력하도록 전환했습니다.
위치만 원하는 경우 grep을 사용하여 위치만 추출할 수 있습니다.
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' | grep -oE '[0-9]+'
14
이상한 출력이 나타나면 grep을 확인하여 색상이 활성화되어 있는지 확인하십시오. --colors=never
grep에 전달하거나 grep 명령 앞에 a를 추가하여 색상을 비활성화할 수 있습니다 \
(이렇게 하면 별칭이 비활성화됩니다). 예를 들면 다음과 같습니다.
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' --color=never | \grep -oE '^[0-9]+'
14
여러 일치 항목을 반환하는 문자열의 경우 파이프를 head -n1
통해 첫 번째 일치 항목을 가져옵니다.
위의 두 가지를 모두 사용했으며 실행 파일(스크립트 또는 기타)을 통해 grep이 "별칭"된 경우 별칭을 사용할 때만 후자는 작동하지 않습니다.
답변2
당신이 사용하는 경우세게 때리다쉘에서는 외부 프로세스를 생성하지 않고 순수하게 내장된 작업을 사용할 수 있습니다.grep또는앗:
$ str="RAMSITALSKHMAN|1223333"
$ tmp="${str%%|*}"
$ if [ "$tmp" != "$str" ]; then
> echo ${#tmp}
> fi
14
$
이것은매개변수 확장모든 문자열 항목을 모두 제거 |
하고 임시 변수에 저장합니다. 그런 다음 임시 변수의 길이를 측정하여 색인을 얻으십시오 |
.
원래 문자열의 존재 여부 를 확인 if
하는 중입니다 . |
그렇지 않은 경우 임시 변수는 원래 변수와 동일합니다.
또한 이는 |
bash 문자열을 인덱싱할 때 종종 유용한 0 기반 인덱싱을 제공합니다. 그러나 1부터 시작하는 인덱스가 필요한 경우 다음을 수행할 수 있습니다.
$ echo $((${#tmp}+1))
15
$
답변3
노력하다:
printf '%s\n' 'RAMSITALSKHMAN|1223333.' | grep -o . | grep -n '|'
산출:
15:|
그러면 1 기반 인덱스 위치가 제공됩니다.
답변4
"expr match" 또는 "expr index"를 사용하여 이 작업을 수행할 수도 있습니다.
expr은 $string $substring과 일치합니다. 여기서 $substring은 RE입니다.
echo `expr match "RAMSITALSKHMAN|1223333" '[A-Z]*.|'`
위의 내용은 일치하는 하위 문자열의 길이를 반환하므로 위치를 제공합니다.
그러나 보다 구체적으로 검색 색인은 다음과 같습니다.
mystring="RAMSITALSKHMAN|122333"
echo `expr index "$mystring" '|'`