다음과 같은 줄에서 마지막 열을 추출하고 싶습니다.
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
라인 구분 기호로 해석됩니다.