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}$"

-o캡처된 그룹만 반환하기 위해 PCRE 옵션을 추가하면 예제가 일치하고 원하는 일치 항목을 반환하는 것을 볼 수 있습니다.

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네 번째 열을 잘라내는 데 사용됩니다. 또한 더 많은 열을 쉽게 선택할 수 있습니다(예: with cut -f1,4등).

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

관련 정보