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