파일을 두 개의 변수로 분할하여 명령으로 파이프

파일을 두 개의 변수로 분할하여 명령으로 파이프

JSON 개체가 있습니다. 두 개의 필드가 있습니다 { href: string, filename: string }. href에서 파일을 다운로드하고 이름을 으로 설정하고 싶습니다 $FILENAME.pdf. 이 문제는 반복적으로 발생합니다.

어떻게 해야 하나요? 항상 구문을 찾아야 하므로 루프가 없는 것이 좋습니다.

나는 다음과 같은 것을 상상하고 있습니다 :cat files.json | jq-like-splitter '.href' '.filename' | wget $HREF -o $FILENAME.pdf

답변1

xargs작은 쉘 스크립트를 사용하고 시작할 수 있습니다 .

jq -r '.href, .filename' file.json | xargs -n2 sh -c 'wget "$1" -O "$2"' sh

wget옵션 은 -o로그 파일 및 -O"출력 문서"에 적용됩니다.

답변2

솔루션과 비슷 xargs하지만 parallel. 을 사용하면
파이프와 추가 호출이 필요하지 않기 때문에 더 우아하다고 생각합니다 sh.

parallel -n2 wget {1} -O {2} ::: "$(jq -r '.href, .filename' file.json)"

답변3

Linux의 jq-splitter에 대해서는 모르지만 sed를 사용하여 필드를 분할하고 출력을 변수로 읽은 다음 wget을 실행할 수 있습니다.

$> read HREF FILENAME < <(sed -r 's/(.*href:[ ]*)([^, ]*)(.*filename:[ ]*)([^, ]*)(.*)$/\2 \4/' files.json);wget "${HREF}" -o "${FILENAME}.pdf"

sed이 옵션을 사용하면 -r정규식을 활성화하고 캡처 그룹을 만들어 href 앞의 모든 항목을 구문 분석한 다음 해당 값을 가져올 수 있습니다. 그런 다음 파일 이름 앞의 모든 항목을 가져오고 해당 값을 가져옵니다. 캡처 그룹 1과 4의 공백으로 구분된 출력을 인쇄합니다.

값을 읽은 HREF다음 FILENAME세미콜론은 저장된 값으로 wget을 실행하는 별도의 명령을 시작합니다.

관련 정보