두 개의 특정 문자 또는 문자열 사이에서 텍스트 찾기

두 개의 특정 문자 또는 문자열 사이에서 텍스트 찾기

다음과 같은 줄이 있다고 가정해 보겠습니다.

*[234]*
*[23]*
*[1453]*

이는 *모든 문자열을 나타냅니다(형식의 문자열 제외 [number]). 명령줄 유틸리티를 사용하여 이러한 줄을 구문 분석하고 대괄호 사이의 숫자를 추출하려면 어떻게 해야 합니까?

보다 일반적으로 다음 도구 중 cut, sed또는 ?grepawk

답변1

GNU grep이 있는 경우 해당 -o옵션을 사용하여 정규식을 검색하고 일치하는 부분만 출력할 수 있습니다. (다른 grep 구현은 전체 줄만 표시할 수 있습니다.) 한 줄에 일치하는 항목이 여러 개 있으면 별도의 줄에 인쇄됩니다.

grep -o '\[[0-9]*\]'

괄호가 아닌 숫자만 원할 경우에는 너비가 0인 어설션을 사용해야 합니다. 즉, 빈 문자열과 일치하는 정규식이지만 앞뒤에 괄호가 있는 경우에만 해당됩니다. 너비가 0인 어설션은 Perl 구문에서만 사용할 수 있습니다.

grep -P -o '(?<=\[)[0-9]*(?=\])'

sed를 사용하면 인쇄를 끄고 -n전체 줄을 일치시키고 일치하는 부분만 유지해야 합니다. 한 줄에 일치하는 항목이 여러 개 있으면 마지막 일치 항목만 인쇄됩니다. 바라보다주변 문자를 인쇄하지 않고 "sed"와 일치하는 정규식 추출sed 사용에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

sed -n 's/^.*\(\[[0-9]*\]\).*/\1/p'

또는 대괄호 대신 숫자만 원하는 경우:

sed -n 's/^.*\[\([0-9]*\)\].*/\1/p'

그렇지 않고 grep -o간단하고 이해하기 쉬운 것을 원한다면 Perl이 선택 가능한 도구입니다. 각 줄( -n)에서 해당 줄에 일치 항목이 포함되어 있으면 \[[0-9]*\]해당 일치 항목( $&)과 개행 문자( -l)를 인쇄합니다.

perl -l -ne '/\[[0-9]*\]/ and print $&'

숫자만 원하는 경우 정규식에 괄호를 넣어 그룹을 구분하고 해당 그룹만 인쇄하세요.

perl -l -ne '/\[([0-9]*)\]/ and print $1'

PS 대괄호 사이에 하나 이상의 숫자만 원하는 경우 Perl에서 [0-9]*또는 [0-9][0-9]*로 변경하십시오 [0-9]+.

답변2

이 작업을 수행하는 데 사용할 수 없습니다 cut.

  1. tr -c -d '0123456789\012'
  2. sed 's/[^0-9]*//g'
  3. awk -F'[^0-9]+' '{ print $1$2$3 }'
  4. grep -o -E '[0-9]+'

tr문제에 가장 적합하고 아마도 가장 빠르게 실행될 것입니다. 그러나 속도 측면에서 이러한 옵션을 구분하려면 많은 입력이 필요할 것이라고 생각합니다.

답변3

숫자가 아닌 문자 사이에서 연속된 숫자 집합을 추출하는 것을 의미하는 경우 가장 좋을 것 같습니다(일치하는 문자도 제공할 수 있지만 sed) .awkgrep

sed: 물론 숫자를 일치시킬 수도 있지만 반대로 숫자가 아닌 항목을 제거하는 것도 흥미로울 수 있습니다(한 줄에 숫자가 하나만 있는 경우).

$ echo nn3334nn | sed -e 's/[^[[:digit:]]]*//g'
3344

grep: 연속된 숫자와 일치할 수 있음

$ echo nn3334nn | grep -o '[[:digit:]]*'
3344

awk나는 이것에 대한 경험이 없기 때문에 예제를 제공하지 않습니다 . 흥미로운 점은 sed스위스 칼이지만 grep이 작업을 수행하는 것이 더 쉽고 읽기 쉬운 방법을 제공하며 각 입력에 대해 여러 숫자에서도 작동한다는 것입니다. line( -o입력의 일치하는 부분을 각각 한 줄에 고유하게 인쇄합니다):

$ echo dna42dna54dna | grep -o '[[:digit:]]*'
42
54

답변4

어떤 사람들은 이것이 불가능하다고 말하기 때문에 cut, 비록 내가 그것을 "최고"로 사용하는 것을 지지하지 않더라도 cut(또는 심지어 특히 좋은) 솔루션입니다. 숫자 *[와 그 주변의 숫자 를 구체적으로 찾지 않는 솔루션은 ]*가정을 단순화하므로 질문자가 제공한 것보다 더 복잡한 예(예: *[숫자 외부에 ]*표시되지 않아야 함) 에서 쉽게 실패합니다. ). 이 솔루션은 최소한 괄호를 확인하고 별표를 확인하도록 확장할 수도 있습니다(독자의 연습용으로 남겨두었습니다).

cut -f 2 -d '[' myfile.txt | cut -f 1 -d ']'

이는 -d구분 기호를 지정하는 옵션을 활용합니다. 물론 cut파일에서 읽는 대신 표현식을 파이프로 연결할 수도 있습니다. 꽤 빠르긴 하지만 cut간단하기 때문에(정규식 엔진 없음) 최소한 두 번(또는 확인하려면 그 이상) 호출해야 하며 *, 이로 인해 약간의 프로세스 오버헤드가 발생합니다. 이 솔루션의 진정한 장점은 특히 정규식 구문에 익숙하지 않은 일반 사용자의 경우 읽기가 상당히 쉽다는 것입니다.

관련 정보