내가 찾은여기Bash에서 하위 문자열을 추출하는 방법은 있지만 파이핑 후에 적용하는 방법을 모르겠습니다. 예를 들어:
some func | echo ${string:12:5}
some func
변수에 출력을 할당하는 방법은 무엇입니까 string
?
답변1
답변
출력을 추출하려는 경우에는 some_func
변수에 저장할 필요가 없으며 cut
요청된 문자를 추출하기 위해 출력을 변수로 보내기만 하면 됩니다.
some_func | cut -c 12-16
설명하다
cut
stdin
요청된 범위는 지정된 옵션에 따라 가져오고 추출됩니다.
-c
표현 범위는 문자로 지정됩니다.
12-16
문자 범위는 1
가 아닌 index 로 시작합니다 0
.
따라서 12
, 13
및 위치 의 문자가 사용 됩니다 14
.15
16
~처럼스티븐 차제라스궁금합니다. 이는 첫 번째 줄뿐만 아니라 모든 입력 줄에 적용된다는 점에 유의하세요.
답변2
${string:offset:length}
변수의 문자 범위로 확장하는 매개변수 확장 연산자입니다 $string
.
시리즈를 얻으려면바이트입력(단일 바이트 문자에서도 작동)에서 다음을 사용할 수 있습니다.
func | tail -c +12 | head -c 5
12번째 바이트부터 시작하여 5바이트를 가져옵니다(1에서 오프셋). 옵션은 표준 -c
은 아니지만 head
일반적입니다.
func
head
이 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}"