Shell에서 많은 문자열을 얻기 위해 하나의 문자를 바꾸는 방법은 무엇입니까?

Shell에서 많은 문자열을 얻기 위해 하나의 문자를 바꾸는 방법은 무엇입니까?

나는 다른 방향에서 답이 있는 많은 질문을 찾을 수 있지만 불행히도 내가 대체하고 싶은 질문에는 없습니다.문자를 교체하다, 와 같은 #,문자열로, 예를 들어 test#asdf, 시퀀스와 함께, 예를 들어{0..10} 일련의 문자열을 얻으려면, 이 예에서는 test0asdf test1asdf test2asdf test3asdf test4asdf test5asdf test6asdf test7asdf test8asdf test9asdf test10asdf.

나는 다른 사람들로부터 다음을 시도했습니다.

  • echo '_#.test' | tr # {0..10}(용법을 던졌습니다)
  • echo '_#.test' | sed -r 's/#/{0..10}/g'(반환 _{0..10}.test)
  • echo '_#.test' | sed -r 's/#/'{0..10}'/g'(처음에는 작동하고 나중에는 얻습니다 sed: can't read (...) no such file or directory)

이 문제에 대한 실제 접근 방식은 무엇입니까?

#아직 설명하지 않았으므로 편집하십시오. 이 문자를 대체해야 하는 문자열에서 다른 프로그램에서 전달된 문자열처럼 사용해야 합니다 . 그래도 먼저 다른 문자로 바꿀 수 있습니다.

답변1

연산자 {0..10} zsh(현재 를 포함한 몇몇 다른 쉘에서도 지원됨 )는 -스타일 중괄호 확장 bash의 또 다른 형태입니다 .csh

확장되었습니다껍질로명령을 호출하기 전에. 명령은 해당 {0..10}.

With tr '#' {0..10}( #그렇지 않으면 쉘에 의해 주석의 시작으로 구문 분석된다는 점을 인용)는 tr("tr", "#", "0", "1", ..., "10")을 인수로 사용하여 호출됩니다. 그렇게 tr많은 논쟁을 기대하지 않습니다.

여기서는 다음을 원할 것입니다.

echo '_'{0..10}'.test' 

echo"_0.test", "_1.test", ..., "_10.test"를 인수로 전달합니다 .

#또는 해당 연산자로 변환 하려면 {0..10}평가할 셸 코드로 변환하세요.

eval "$(echo 'echo _#.test' | sed 's/#/{0..10}/')"

인수로 전달되는 곳은 어디 eval입니까 ?echo _{0..10}.test

(나는 그런 일을 하는 것을 권장하지 않습니다).

답변2

당신은 할 수 있습니다나뉘다구분 기호의 문자열을 검색하고 접두사와 접미사를 캡처한 다음 중괄호 확장을 사용하여 이름을 생성합니다.

str='test#asdf'
IFS='#' read -r prefix suffix <<<"$str"
names=( "$prefix"{0..10}"$suffix" )
declare -p names
declare -a names='([0]="test0asdf" [1]="test1asdf" [2]="test2asdf" [3]="test3asdf" [4]="test4asdf" [5]="test5asdf" [6]="test6asdf" [7]="test7asdf" [8]="test8asdf" [9]="test9asdf" [10]="test10asdf")'

답변3

꼭 사용해야 하나요 #? 어쩌면 당신은 사용할 수 있습니까 %d?

$ for i in {1..10}; do printf "_%d.test " "$i"; done
_1.test _2.test _3.test _4.test _5.test _6.test _7.test _8.test _9.test _10.test

답변4

나는 그것을 할 것이다매개변수 확장:

$ var='test#asdf'
$ for i in {1..10}; do echo "${var/\#/"$i"}"; done
test1asdf
test2asdf
test3asdf
test4asdf
test5asdf
test6asdf
test7asdf
test8asdf
test9asdf
test10asdf

확장​${parameter/pattern/string}

  • (우리의 경우 ) 의 확장을 취하고$parameter$var
  • 첫 번째 발생을 대체합니다.pattern(이스케이프된 #/#우리가 피하고 싶은 "문자열의 시작 부분에서 바꾸기"라는 맥락에서 특별한 의미를 갖습니다)
  • string( "$i"우리의 경우)

#또는 를 로 바꾸고 %d다음의 형식 문자열로 사용할 수 있습니다 printf.

printf "${var/\#/%d}\\n" {1..10}

관련 정보