선택한 문자에서 역방향으로 텍스트 추출

선택한 문자에서 역방향으로 텍스트 추출

다음 줄이 포함된 파일이 있습니다.

handleNewConnection:: User [email protected] has 2 active nodes
handleNewConnection:: User [email protected] has 2 active nodes
handleNewConnection:: User [email protected] has 2 active nodes
handleNewConnection:: User [email protected] has 2 active nodes

시스템은 "@"(선택한 문자)를 찾은 다음 "@" 기호에서 역방향으로 문자열을 추출해야 합니다. 알다시피 숫자나 알파벳 문자를 포함할 수 있으며 길이는 일정하지 않습니다.

그리고 grep -o '[^"]@' /tmp/has2.txt

나는 얻다:

m@
2@
1@
g@

1) 이런 식으로 두 번째 텍스트 파일을 얻을 수 있는지 아는 사람이 있습니까?

langfordm
bas102
bah001
mattleg

2) 1)에서 생성된 이름을 다른 프로세스의 입력으로 단독으로 사용할 수 있는지 아는 사람이 있습니까?

답변1

grepPCRE()와 함께 사용 -P:

$ grep -Po '.*\s\K[^@]+(?=@)' file.txt
langfordm
bas102
bah001
mattleg

또는 GNU를 사용하십시오 sed:

$ sed -r 's/.*\s([^@]+)@.*/\1/' file.txt 
langfordm
bas102
bah001
mattleg

분명히 다음 프로세스가 입력을 받는 방법에 따라 다른 프로세스에서 결과를 사용할 수 있습니다. 이에 따라 배열을 만들거나 결과를 다음 프로세스의 STDIN에 직접 전달할 수 있습니다.

답변2

Perl 호환성 옵션을 사용하는 것은 매우 쉽습니다:

grep -Po '\w+(?=@)' file

이는 \w모든 단어 문자와 일치하므로 (?=...)호출됩니다 .시야정규식.

산출:

langfordm
bas102
bah001
mattleg

답변3

여러 가지 방법이 있습니다. 가장 쉬운 방법은 정규식 패턴 일치를 사용하는 것입니다.

grep -io '[a-z0-9_.]*@[a-z0-9_.]*'

이것은 다음을 포함하여 가장 긴 문자열과 일치하고 인쇄됩니다.

  • 또는 *범위에서 대소문자를 구분하지 않는 0개 이상의 문자( )a-z0-9_.
  • 정확히 하나@
  • 또는 *범위에서 대소문자를 구분하지 않는 0개 이상의 문자( )a-z0-9_.

그런 다음 @domain부품을 분리하십시오

cut -d@ -f1

그래서 완전한 라인은

grep -io '[a-z0-9_.]*@[a-z0-9_.]*' /tmp/file.txt | cut -d@ -f1

대안은 grep패턴의 사용자 이름 부분을 한 단계로 인쇄할 수 있는 Lookahead PCRE를 사용하는 것입니다. 이는 올바르게 이해하기 어렵지만 위의 예에서는 username@domain필요 하지 않습니다.cut

grep -Pio '\S+(?=@\S+)'

이것은 의미한다

  • 하나 이상의 ( +) 공백이 아닌 문자 ( \S) 와 일치합니다.
  • 패턴 @과 하나 이상의 ( +) 공백이 아닌 문자 ( \S) 가 뒤따릅니다.

답변4

모든 버전에서 sed기본 정규 표현식을 사용하세요.

sed -e 's/.* \([^@]\+\)@.*/\1/' /tmp/has2.txt

두 번째 질문은 다음과 같습니다.언제나다음과 같은 경우 어떤 방식으로든 입력, 추출 또는 생성된 데이터를 다른 프로세스에 대한 입력으로 사용하십시오.

  1. sed다른 프로세스에서 사용할 수 있는 형식입니다(또는 , awk, perl및/또는 기타 일반적인 도구를 사용하여 형식으로 변환할 수 있음).

  2. 다른 프로세스는 표준 입력이나 하나 이상의 파일에서 입력을 받을 수 있습니다. 즉, 특정 위치에 있는 하나의 특정 파일에서만 입력을 받도록 하드코딩되지 않았습니다. 그런 경우에도 해당 특정 파일을 생성/덮어쓰는 경우 여기에는 귀하의 데이터가 포함되어 있으며 계속 작동할 것입니다.

이것이 Unix와 가젯 접근 방식의 장점입니다. 이는 데이터 중심 방식(사용자 정의 도구 포함)을 선택하여 원하는 도구를 사용하여 원하는 작업을 수행할 수 있는 데이터 중심 방식으로 생각하도록 권장합니다. 애플리케이션 중심 접근 방식(데이터가 마법의 블랙박스 애플리케이션에 속하고 해당 특정 애플리케이션을 통해서만 데이터를 조작하거나 상호 작용할 수 있음).

마찬가지로 중요한 것은 애플리케이션 개발자를 포함한 개발자가 유사한 데이터 중심 방식으로 생각하도록 장려한다는 것입니다. 앱 개발자가 앱에서 사용자 데이터를 잠가서 요구 사항을 방해하려고 하면 사용자는 이를 버그이자 권리 침해로 간주합니다.

관련 정보