후행 개행 없이 grep 출력 만들기

후행 개행 없이 grep 출력 만들기

다음 스니펫을 고려해보세요.

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.

관련 정보