중괄호 확장 중에 생성된 인수 사이의 공백을 억제하는 방법은 무엇입니까?

중괄호 확장 중에 생성된 인수 사이의 공백을 억제하는 방법은 무엇입니까?

다음을 사용하여 테스트할 URL 목록을 만들었습니다.

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

안타깝게도 추가된 모든 URL urls.txt앞에는 공백이 옵니다(물론 첫 번째 URL은 제외). 왜 이런 일이 일어나는지 이해하고 파이핑으로 벗겨낼 수 있다는 것도 알지만 sed억제할 수 있는 방법이 있는지 궁금합니다. (이것은 어리석고 현학적인 것처럼 보일 수도 있지만 많은 사람들이 선호하는 것과 다르지 않습니다.'고양이 학대'가 아니다.)

나는 노력했다단어 분리를 억제하는 큰따옴표, 그러나 이는 지원 확장도 방해하므로 작동하지 않습니다.

IFS를 빈 문자열로 변경하려고 시도했지만 작동하지 않았습니다.

IFS='' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

또한 개행으로 변경하지 않고:

IFS='\n' echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}"\n" >> urls.txt

답변1

printf내장된 기능을 사용하세요 :

$ printf %s\\n localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}
localhost:8080/reports/promos/130
localhost:8080/reports/promos/130.pdf
localhost:8080/reports/promos/130.xls
localhost:8080/reports/promos/130.xlsx
localhost:8080/reports/promos/130.csv
localhost:8080/reports/promos/130.preload
localhost:8080/reports/promos/130-unburdened
localhost:8080/reports/promos/130-unburdened.pdf
localhost:8080/reports/promos/130-unburdened.xls
localhost:8080/reports/promos/130-unburdened.xlsx
localhost:8080/reports/promos/130-unburdened.csv
localhost:8080/reports/promos/130-unburdened.preload
....

답변2

중괄호 확장을 배열에 저장한 다음 원하는 방식으로 출력할 수 있습니다.

urls=( localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} )

그 다음에

printf "%s\n" "${urls[@]}"

또는

(IFS=$'\n'; echo "${urls[*]}")

에코 예제는 다음과 같은 이유로 이상해 보입니다.

  1. 서브셸(괄호)에서 실행되므로 IFS의 현재 값을 변경하지 않습니다.
  2. IFS는 별도의 명령으로 정의해야 합니다.
    • 이것은 작동하지 않습니다. IFS=$'\n' echo "${urls[*]}"새 환경 변수가 적용되기 전에 변수가 확장되기 때문입니다.
    • IFS를 설정해야 합니다.앞으로변수 확장을 시작합니다.

또한 사용된 역참조 배열 인덱스의 미묘한 차이에 유의하세요.

  • [@]printf 예제에서 배열을 단일 단어로 확장
  • [*]에코 예제에서 배열을 단일 단어로 확장하고 요소는 IFS의 첫 번째 문자로 구분됩니다.

답변3

이것은 zsh 태그가 지정되어 있으므로 zsh 내장 기능을 사용하는 것이 좋습니다 print.

print -l localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}

-l별도의 줄에 매개변수를 인쇄합니다.

답변4

문제는 중괄호 확장이 공백을 추가하는 반면 echo는 개행을 추가한다는 것입니다. 따라서 단일 책임 원칙을 사용하고 개행 문자를 별도로 처리하십시오.

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} | tr " " "\n"

관련 정보