
나는 다른 방향에서 답이 있는 많은 질문을 찾을 수 있지만 불행히도 내가 대체하고 싶은 질문에는 없습니다.문자를 교체하다, 와 같은 #
,문자열로, 예를 들어 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}