구분 기호 앞의 첫 번째 단어만 포함하도록 파일 이름을 자르는 방법

구분 기호 앞의 첫 번째 단어만 포함하도록 파일 이름을 자르는 방법

whl 파일의 패키지 이름을 얻으려고 합니다.

이러한 파일은

ls  /python/*.whl
/python/argparse-1.4.0-py2.py3-none-any.whl                   /python/Jinja2-2.11.2-py2.py3-none-any.whl
/python/certifi-2019.9.11-py2.py3-none-any.whl                /python/kazoo-2.2.1-py2.py3-none-any.whl
/python/cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl         /python/MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl
/python/chardet-3.0.4-py2.py3-none-any.whl                    /python/protobuf-3.0.0-py2.py3-none-any.whl

-..........whl다음 예와 같이 예상되는 출력은 (none )이어야 합니다.

  ls  /python/*.whl | SOME SYNTAX ......

    /python/argparse      /python/Jinja2
    /python/certifi      /python/kazoo
    /python/cffi         /python/MarkupSafe
    /python/chardet     /python/protobuf

위의 패키지 이름만 얻는 방법에 대한 아이디어가 있습니까?

답변1

첫 번째,파싱되지 않음ls. 대신 glob을 사용하세요.

$ for f in /python/*.whl; do printf '%s\n' "${f//-*}"; done
/python/argparse
/python/certifi
/python/cffi
/python/chardet
/python/Jinja2
/python/kazoo
/python/MarkupSafe
/python/protobuf

-이렇게 하면 경로의 첫 번째 항목 이후의 모든 내용이 삭제됩니다. 따라서 -패키지 이름 앞에 가 있으면 잘못된 결과를 얻을 수 있습니다.

답변2

두 가지 방법이 있습니다. 매개변수 대체를 사용하여 이름이 포함된 배열의 첫 번째 대시 뒤에 있는 파일 이름 비트를 제거하거나 루프에서 각 이름의 파일 이름 비트를 개별적으로 제거합니다.

배열을 사용하십시오:

$ names=( /python/*-*.whl )
$ printf '%s\n' "${names[@]%%-*}"
/python/Jinja2
/python/MarkupSafe
/python/argparse
/python/certifi
/python/cffi
/python/chardet
/python/kazoo
/python/protobuf

또는 명명된 배열 대신 위치 인수를 사용합니다.

set -- /python/*-*.whl
printf '%s\n' "${@%%-*}"

루프를 사용하십시오.

$ for name in /python/*-*.whl; do printf '%s\n' "${name%%-*}"; done
/python/Jinja2
/python/MarkupSafe
/python/argparse
/python/certifi
/python/cffi
/python/chardet
/python/kazoo
/python/protobuf

저는 일치하는 이름에 실제로 파일 이름을 자르는 데 사용할 수 있는 대시가 포함되어 있는지 확인하기 위해 /python/*-*.whl파일 이름을 일치시키는 패턴을 사용하고 있습니다 ./python/*.whl

매개변수 대체는 값에서 ${variable%%pattern}가능한 가장 긴 부분 문자열 일치를 제거하는 표준 대체입니다. 쉘은 또한 배열 요소에 대한 이러한 대체를 허용합니다(위의 첫 번째 변형에서 사용됨).pattern$variablebash

생성된 열과 동일한 유형의 열을 얻으려면 ls결과 이름을 파이프하십시오 column. 예를 들어 다음과 같습니다.

$ for name in /python/*.whl; do printf '%s\n' "${name%%-*}"; done | column
/python/Jinja2           /python/certifi          /python/kazoo
/python/MarkupSafe       /python/cffi             /python/protobuf
/python/argparse         /python/chardet

답변3

단방향, 루프 없음:

printf '%s\n' python/*.whl | cut -d'-' -f1

답변4

그리고 zsh:

print -rC1 /python/*-*.whl(Ne['REPLY=${REPLY%%-*}'])

또는:

() { print -rC1 "${@%%-*}"; } /python/*-*.whl

또는:

set -o histsubstpattern
print -rC1 /python/*-*.whl(N:s/-*//)

관련 정보