필러를 grep하고 부동 소수점을 서명하는 정규 표현식

필러를 grep하고 부동 소수점을 서명하는 정규 표현식

다음과 같이 행에서 마지막 열을 추출하고 싶습니다.

880.952         NAV_Y                uSimMarine      -146.17516

숫자는 항상 음수가 아니며 고정된 길이가 아닙니다(즉, 소수 자릿수가 항상 동일하지는 않습니다).

이것은 나에게 대부분의 내용을 명확하게 해줍니다.

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

그러나 첫 번째 열의 숫자와도 일치합니다.

첫 번째 열 일치를 제거하기 위해 행의 끝을 포함하도록 변경하는 경우:

grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

일치하는 항목이 하나도 없고 이해가 되지 않습니다.

내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

줄 끝 부분에 표현식 고정:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

캡처된 그룹만 반환 하도록 PCRE 옵션을 추가하면 -o예제 일치가 표시되고 원하는 일치가 반환됩니다.

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"

-146.17516

마찬가지로 선택적 후행 공백이 있는 파일의 행과 일치하는 항목을 캡처하려면 다음 \s*과 같이 추가하면 됩니다.

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"

답변2

첫 번째 정규식 앞에 공백을 추가합니다.

grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

줄 시작 부분에서 일치하는 항목을 제외하므로 트릭을 수행해야 합니다.

네가 원한다면오직네 번째 열에서는 GNU sed를 사용하여 이를 쉽게 달성할 수 있습니다.

sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'

\s공백 문자(공백, 탭 및 다양한 "피드" 1 )와 공백이 아닌 문자는 어디에 있습니까 \S? 또는 (더 간결하게) sed | cut:

sed 's/\s\+/\t/g' | cut -f4

먼저 모든 공백을 하나의 탭으로 압축한 다음 cut네 번째 열을 자르는 데 사용됩니다. 또한 cut -f1,4등과 같은 더 많은 열을 쉽게 선택할 수 있습니다 .

1) 즉, 폼 피드, 라인 피드, 캐리지 리턴이 있지만 그 사이의 항목은 일반적으로 sed줄 구분 기호로 해석됩니다.

관련 정보