주어진 구분 기호 사이의 n번째 하위 문자열을 파악하는 방법은 무엇입니까?

주어진 구분 기호 사이의 n번째 하위 문자열을 파악하는 방법은 무엇입니까?

구분 기호가 다음과 같은 문자열이 있다고 가정합니다 ?.

Leslie Cheung April 1 ? Elvis August 16 ? Leonard Nimoy February 27

grep문자 사이의 첫 번째 하위 문자열을 구분하는 방법을 알고 있습니다 .

echo $above_string | grep -oP "^[^?]*"
Leslie Cheung April 1

두 번째 또는 세 번째 하위 문자열을 grep하려면 정규식을 어떻게 변경해야 합니까?

답변1

전단을 사용하는 것은 어떻습니까? 두 번째 패턴을 인쇄하려면

echo "$above_string" | cut -f2 -d "?"

두 번째 열 이후

echo "$above_string" | cut -f2- -d "?"

답변2

echo $above_string | grep -oP "^([^?]*\?){2}\K[^?]*"

n 번째 문자열을 얻으려면 값을 2변경 하십시오 .n - 1

이것은 n 번째 문자열을 원한다고 가정합니다.그 라인에. 리터럴 "?"( perl 정규식의 특수 문자이기 때문에) ?로 끝나지 않는 n - 1개의 문자열이 있습니다 . \?그런 다음 \K이전 내용에 관심이 없다고 선언하므로 다음 구분 기호까지 다음 텍스트만 추출합니다.

답변3

awk를 사용하여 줄 바꿈으로 구분된 두 번째 및 세 번째 레코드를 인쇄합니다.

awk -F"?" '{printf "%s\n%s\n", $2,$3}'
Elvis August 16 
Leonard Nimoy February 27

레코드를 교체하려면 변수로 설정할 수 있습니다.

awk -v record=2 -F"?" '{print $record}'
Elvis August 16 

답변4

sed

이를 달성하기 위해 sed를 사용할 수 있지만 권장되지는 않습니다. 예를 들어 다음은 수량자를 사용하여 필수 필드를 선택하는 처음부터의 솔루션입니다.

n=1
sed 's/\([^?]*? *\)\{'$n'\}//; s/?.*//' <<<"$above_string"

산출:

Elvis August 16 

관련 정보