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(Escape #/#우리가 피하고 싶은 "문자열의 시작 부분에서 교체"라는 맥락에서 특별한 의미를 갖습니다.)
  • string( "$i"우리의 경우)

또는 이를 형식 문자열로 바꾸어 사용할 #수 있습니다 .%dprintf

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

관련 정보