Bash에서 마지막 n자를 제외한 모든 문자를 인쇄하는 방법은 무엇입니까?

Bash에서 마지막 n자를 제외한 모든 문자를 인쇄하는 방법은 무엇입니까?

저는 표준 입력( cat두 개의 파일을 함께 사용)을 사용하고 있으며 결과의 마지막 10자를 제외한 모든 문자가 다음 명령을 통해 전달되기를 원합니다.

검색을 통해 찾을 수 있는 것은 sed, 를 사용하여 각 줄의 마지막 n자를 삭제하거나, awk또는 을 사용 하여 n 줄을 삭제하는 것입니다.trheadtailrev

이 작업을 수행하기 위해 표준 출력에서 ​​명령으로 파이프하려면 무엇을 사용할 수 있습니까(간단하고 단일 명령을 사용하여)?

예:

Input:
SELECT 'A', 1, GETDATE() UNION ALL
SELECT 'B', 2, GETDATE() UNION ALL
...
SELECT 'Z', 2, GETDATE() UNION ALL

Output:
SELECT 'A', 1, GETDATE() UNION ALL
SELECT 'B', 2, GETDATE() UNION ALL
...
SELECT 'Z', 2, GETDATE()

어쨌든 저는 Windows에서 CygWin을 사용하고 있기 때문에 상당히 표준적이고 오래된 유닉스 도구와 함께 사용해야 합니다 :(

답변1

당신이 사용할 수있는 head:

command | head -c-10

command마지막 10바이트가 출력에서 ​​제거됩니다.

인용 출처 man head:

   -c, --bytes=[-]K
          print the first K bytes of each  file;  with  the  leading  `-',
          print all but the last K bytes of each file

제거하려는 10개의 문자가 한 줄에 표시된다고 구체적으로 언급하셨으니 sed그것도 사용하시면 됩니다. 명령 출력을 다음으로 파이프합니다.

sed '$s/\(.\{10\}\)$//'

또는 sed확장 정규식을 지원하는 경우:

sed -r '$s/.{10}$//'

구문은 다음과 유사합니다 perl.

perl -pe 's/.{10}$// if eof'

답변2

다음을 사용해야 합니다 perl.

$ perl -lpe '$_=substr($_,0,-10) if eof' file
SELECT 'A', 1, GETDATE() UNION ALL
SELECT 'B', 2, GETDATE() UNION ALL
...
SELECT 'Z', 2, GETDATE()

관련 정보