파이프 출력에서 ​​하위 문자열을 에코하는 방법은 무엇입니까?

파이프 출력에서 ​​하위 문자열을 에코하는 방법은 무엇입니까?

내가 찾은여기Bash에서 하위 문자열을 추출하는 방법은 있지만 파이핑 후에 적용하는 방법을 모르겠습니다. 예를 들어:

some func | echo ${string:12:5}

some func변수에 출력을 할당하는 방법은 무엇입니까 string?

답변1

답변

출력을 추출하려는 경우에는 some_func변수에 저장할 필요가 없으며 cut요청된 문자를 추출하기 위해 출력을 변수로 보내기만 하면 됩니다.

some_func | cut -c 12-16  

설명하다

cutstdin요청된 범위는 지정된 옵션에 따라 가져오고 추출됩니다.

-c표현 범위는 문자로 지정됩니다.

12-16문자 범위는 1가 아닌 index 로 시작합니다 0.
따라서 12, 13및 위치 의 문자가 사용 됩니다 14.1516

~처럼스티븐 차제라스궁금합니다. 이는 첫 번째 줄뿐만 아니라 모든 입력 줄에 적용된다는 점에 유의하세요.

답변2

${string:offset:length}변수의 문자 범위로 확장하는 매개변수 확장 연산자입니다 $string.

시리즈를 얻으려면바이트입력(단일 바이트 문자에서도 작동)에서 다음을 사용할 수 있습니다.

func | tail -c +12 | head -c 5

12번째 바이트부터 시작하여 5바이트를 가져옵니다(1에서 오프셋). 옵션은 표준 -c은 아니지만 head일반적입니다.

funchead이 5바이트를 출력한 후 종료되므로 16번째 바이트를 출력한 후에 종료될 수 있으며 tail, 이후에 더 많은 데이터를 쓰려고 하면 종료됩니다. 이는 에 영향을 미칩니다 func.

다음과 같이 할 수도 있습니다.

func | dd bs=1 skip=11 count=5 2> /dev/null

2> /dev/null이는 마지막에 상태 메시지가 표시되는 것을 방지하기 위한 것입니다. 그러나 이렇게 하면 모든 오류가 억제됩니다. GNU를 사용하면 이를 상태만 억제하는 dd것으로 대체할 수 있습니다 .status=none

값이 클수록 length한 번에 한 바이트씩 읽기 때문에 효율성이 떨어집니다. 다시 GNU를 사용하면 dd다음을 수행하여 이 문제를 피할 수 있습니다.

func | dd iflag=count_bytes,skip_bytes,fullblock skip=11 bs=64k count=5M status=none

5MiB 바이트의 데이터를 얻으려면 매번 최대 64KiB를 읽으십시오.

이제 바이트가 아닌 문자(단일 또는 다중 바이트)로 표현되는 오프셋과 길이의 경우 이는 더 복잡해집니다.

한 가지 옵션은 전체 출력을 변수에 저장하고 ${var:offset:length}연산자를 사용하는 것입니다.다른 사람들이 보여준 것처럼. 그러나 이는 전체 출력을 메모리에 저장하는 것을 의미합니다. 또한를 사용하면 var=$(func)후행 개행 문자가 삭제된다는 의미입니다.

또 다른 옵션은 bash's를 사용하여 read -N주어진 금액을 읽는 것 입니다.수치:

func | {
  IFS= read -rN 11 discarded
  IFS= read -rN 5 data
  printf '%s\n' "$data"
}

또는 다음을 사용하십시오 perl(빅 데이터의 경우 약간 더 효율적임).

func | perl -Mopen=locale -sne '
  BEGIN{$total = $o + $n; $/ = \$total}
  print substr($_, $o); exit' -- -o=10000 -n=5000000

답변3

string="$(func)"
echo "${string:12:5}"

관련 정보