다음 스니펫을 고려해보세요.
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* //p')
일부 패턴 조건이 임의의 텍스트 파일의 줄과 일치하면 마지막 단어를 변수에 넣고 싶습니다.
내 문제는 소스 파일에 따라 변수 X
끝에 CR, LF 또는 CRLF가 있는데, 수행하려는 후속 작업을 방해하기 때문에 이를 제거하고 싶다는 것입니다.
나는 심지어 다음과 같은 것을 시도했습니다.
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* \([A-Za-z]\+\)/\1/p')
따라서 예상되는 sed
출력은 제한되어 있지만 [A-Za-z]+
X 변수 내부에는 여전히 불쾌한 바이트가 있습니다.
끝에 어떤 바이트가 있는지 확인하는 것과 유사한 복잡한 문제를 확인하는 xxd
등 너무 많은 코드를 사용하지 않고 어떻게 이를 제거할 수 있습니까?cut
답변1
또는 끝에서 개행 문자를 제거하지만 프로그래밍 방식으로 이를 수행하려면 를 사용하십시오 ``
.$()
tr
grep -m1 'some-pattern' some-file | sed -n 's/.* //p' | tr -d '\012\015'
이렇게 하면 문자열에서 캐리지 리턴 및/또는 줄 바꿈이 제거됩니다.
문제는 당신이 어떻게산출결과. 예를 들어 기본적으로 echo
개행 문자가 추가됩니다 . echo -n
또는 를 사용할 수도 있습니다 printf
.
답변2
awk
이는 필드 및 레코드와 함께 작동할 수 있으므로 다음과 같은 문제가 없기 때문에 귀하의 요구에 더 나은 옵션인 것 같습니다 .
x=$(awk '/some-pattern/ { sub(/\r$/, "") ; printf("%s", $NF) ; exit }' some-file)
교체를 통해 CRLF 줄 끝 문제를 방지할 수 있습니다.
sub(/\r$/, "")
후행 CR이 있는 경우 제거합니다. 레코드(행) 구분자 awk
로 간주되므로 \n
조회 중인 데이터에는 없으므로 제거할 필요가 없습니다.
printf("%s", $NF)
$NF
후행 개행 없이 마지막 필드( )를 인쇄합니다 ( print
일부 다른 awk
함수는 기본적으로 개행을 추가합니다).
exit
처음 두 작업 후에 발생합니다. 이는 명령줄 m1
에 있는 것과 같습니다 . grep
이렇게 하면 awk
처음 두 명령이 실행된 후 종료가 보장됩니다. 이러한 명령은 일치 항목에 대해 실행되고 awk는 FIFO 방식으로 데이터를 평가하므로 첫 번째 일치 항목만 인쇄됩니다.
답변3
나는 이 방법을 선호한다
grep -m1 'some-pattern' some-file | sed -n 's/.* //p' | tr -d '\n'
답변4
grep의 일반 버전(grep -P 포함)은 항상 일치하는 개행 문자를 출력하므로 결과가 하나만 있는 경우(또는 마지막으로 추가된 개행 문자를 제거하려는 경우) 마지막 문자를 제거하는 것만으로도 충분합니다. 을 통해 파이핑하여 이를 수행할 수 있습니다 head -c-1
.