파이프에서 문자열의 첫 번째 [x] 문자를 가져옴


답변:


82

한 가지 방법은 다음을 사용하는 것입니다 cut.

 command | cut -c1-8

각 출력 줄의 처음 8자를 제공합니다. cutPOSIX의 일부 이기 때문에 대부분의 Unices에있을 가능성이 큽니다.


3
cut -c문자 를 선택합니다. cut -b또는 head -c바이트를 선택합니다. 이것은 일부 로케일 (실제로 UTF-8을 사용할 때)에서 차이를 만듭니다.
Gilles

이 경우 시작 색인을 지정할 필요도 없습니다. 말 cut -c-81에서 8까지 선택할 것입니다.
Sparhawk

@Steven, cut의 Windows와 동일합니까?
Pacerier

또한 command | dd bs=8 count=1 2>/dev/null. 짧거나 우수하다고 말하지 않습니다. 또 다른 대안.
dubiousjim

@Gilles, 그러나 현재 버전의 GNU cut에서는 cut -c작동합니다 cut -b(즉, 멀티 바이트 문자에 대해서는 제대로 작동하지 않음).
Stéphane Chazelas

24

이것들은 처음 8자를 얻는 다른 방법입니다.

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

그리고 배쉬가 있다면

var=$(command)
echo ${var:0:8}

2
나는 다음의 sed 공식이 조금 더 읽기 쉽다고 생각한다 : command | sed 's/\(.\{8\}\).*/\1/'또는 sed가 그것을 지원한다면 : command | sed -r 's/(.{8}).*/\1/'; 그렇지 않으면 +1
Steven D

좋은 물건이지만 문자가 아닌 바이트head -c 수 를 계산 합니다 . 마찬가지로 주요 Awk 구현 중 GNU awk 만 멀티 바이트 문자를 올바르게 처리합니다. FreeBSD Awk와 Mawk는 그렇지 않습니다.
mklement0

2

충분히 고급 쉘을 가지고 있다면 (예를 들어, 대시에서 확실하지 않은 Bash에서 다음과 같이 작동합니다) 할 수 있습니다 :

read -n8 -d$'\0' -r <(command)

실행 후 read ... <(command)문자는 쉘 변수에있게 REPLY됩니다. help read다른 옵션에 대해 배우려면 입력하십시오 .

설명 : 우리가 최대 8 문자를 원한다는 -n8주장 read. 는 -d$'\0'널 때까지보다는 개행 읽어 말한다. 이런 식으로 이전 문자 중 하나가 개행 문자이지만 널이 아닌 경우에도 8자를 계속 읽습니다. 에 대한 대안은 -n8 -d$'\0'사용하는 것입니다 -N8정확히 8 자 또는 표준 입력이 EOF에 도달 할 때까지 읽는. 구분 기호가 없습니다. 그것은 아마도 더 나은 당신의 요구에 맞는, 그러나 나는 명예 읽기가 즉석 얼마나 많은 포탄 모르는 -N명예를 반대 -n-d. 설명을 계속하십시오. -rignore \-escapes 라고 말하면 예를 들어 \\단일 문자가 아닌 두 문자로 처리 됩니다 \.

마지막으로, 우리가 할 read ... <(command)것이 아니라 command | read ...때문에 두 번째 형태로, 읽기는 방금 읽은 정보가 손실, 즉시 종료되는 서브 쉘에서 실행됩니다.

또 다른 옵션은 서브 쉘 내에서 모든 처리를 수행하는 것입니다. 예를 들면 다음과 같습니다.

$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>

1
8 문자를 출력하고 쉘에서 처리 할 필요가 없다면을 사용하십시오 cut.
dubiousjim

알아두면 좋습니다 read -n <num>. 작은주의 사항 : Bash 3.x (여전히 OS의 현재)는 실수 <num>바이트 수로 해석 되어 멀티 바이트 문자로 실패합니다. 이것은 Bash 4.x에서 수정되었습니다.
mklement0

이것은 위대하고 유용한 답변입니다. 다른 것보다 훨씬 일반적입니다.
not2qubit

2

파라미터 확장 을 사용하는 또 하나의 라이너 솔루션

echo ${word:0:x}

EG: word="Hello world"
echo ${word:0:3} or echo ${word::3} 
o/p: Hel


EG.2: word="Hello world"
echo ${word:1:3}
o/p: ell

x=8; echo ${word:0:$x}정수를 하드 코딩하는 대신 길이를 유지하는 변수를 사용할 수도 있습니다 .
Cometsong

1

이것은 휴대용입니다.

a="$(command)"             # Get the output of the command.
b="????"                   # as many ? as characters are needed.
echo ${a%"${a#${b}}"}      # select that many chars from $a

가변 길이의 문자로 구성된 문자열을 만들려면 여기에 자체 질문이 있습니다 .


0

maven 저장소에서 체크섬 파일을 수동으로 생성 할 때이 문제가 발생했습니다. 불행히도 cut -c항상 출력 끝에 줄 바꿈을 인쇄합니다. 내가 사용하는 것을 억제하려면 xxd:

command | xxd -l$BYTES | xxd -r

의 출력이 더 짧은 경우가 아니면 정확히 해당 출력이 $BYTES아닌 한 정확하게 바이트 command를 출력합니다.


cut후행 줄 바꿈 을 해제하는 또 다른 방법 은 다음과 같이 | tr -d '\n'
정리하는 것입니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.