구분 기호가 다음과 같은 문자열이 있다고 가정합니다 ?
.
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