다른 방향에서 많은 질문과 답변을 찾을 수 있지만 불행히도 내가 원하는 대체 방법은 없습니다.문자를 교체하다, 예를 들어 #
,문자열로, 예를 들어 다음 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"
우리의 경우)
또는 이를 형식 문자열로 바꾸어 사용할 #
수 있습니다 .%d
printf
printf "${var/\#/%d}\\n" {1..10}