변수 내의 임의의 위치에 변수를 삽입하는 방법은 무엇입니까?

변수 내의 임의의 위치에 변수를 삽입하는 방법은 무엇입니까?

묻다:정말 임의의 위치에 변수 $b를 변수 $a에 삽입하는 방법은 무엇입니까?

INPUT 변수 내용의 예:

$ echo $a
árvíztűrő tükörfúrógép
$ echo $b
ZZ

산출

$ ./somemagicscript.sh
árvíztűrő tüköZZrfúrógép
$ ./somemagicscript.sh
árvíztűrő tükörfúrZZógép
$ ./somemagicscript.sh
árvíztűrZZő tükörfúrógép
$ ./somemagicscript.sh
árvíztűrő tZZükörfúrógép

고쳐 쓰다:OpenBSD에서는 때때로 삽입된 변수 옆에 "�" 문자가 배치되기 때문에 현재 답변은 완벽하지 않습니다. :\

아마도 삽입된 변수가 멀티바이트 문자에 바로 인접해 있는 경우보다 더 그럴 것입니다.

답변1

sed "s/.\{$(($RANDOM%${#a}))\}/&$b/" <<< $a

어디:

  • $RANDOM0에서 $RAND_MAX(보통0x7fff==32767)
  • ${#a}대상 문자열의 길이
  • $((...%...))나눗셈의 나머지를 출력
  • .{n}입력 문자열의 처음 n개 문자와 일치합니다.
  • s/.../&$b/패턴 일치 자체를 교체 +$b

답변2

다른 답변은 sed 및 awk를 사용한 솔루션을 제공합니다. sed와 awk가 멀티바이트 문자를 지원하지 않는다면 bash가 여전히 이를 지원할 가능성이 높으므로 여기에 순수한 bash 솔루션이 있습니다.

먼저, 문자열이 첫 번째 문자 앞이나 마지막 문자 뒤의 두 문자 사이에 삽입될 수 $a있도록 0과 문자열 길이(포함) 사이의 임의의 숫자를 선택합니다 . 이것은 에 저장됩니다 . 그런 다음 (의사 코드를 사용하여)로 구성된 문자열 (0부터 시작하여 인덱스 )을 만듭니다.$b$amida[0..mid-1] + b + a[mid..$]

$ cat ./multi
#!/bin/bash
a='árvíztűrő tükörfúrógép'
b='ZZ'
len=${#a}
echo "a is ${a} len is ${len}"
mid=$(((len + 1) * $RANDOM / 32767))
c="${a:0:$mid}${b}${a:$mid}"
echo "$c"

$ ./multi
a is árvíztűrő tükörfúrógép len is 22
árvíztűrő tükörfúrógéZZp
$ ./multi
a is árvíztűrő tükörfúrógép len is 22
árvízZZtűrő tükörfúrógép
$ ./multi
a is árvíztűrő tükörfúrógép len is 22
árvíztűrő tükörZZfúrógép
$ ./multi
a is árvíztűrő tükörfúrógép len is 22
ZZárvíztűrő tükörfúrógép

답변3

awk에서 시도해 보세요:

awk "{srand(); i=int(rand()*length(\$0)); print substr(\$0,0,i)\"${b}\"substr(\$0,i)}" <<< $a

답변4

Perl에서(셸 스크립트용):

perl -CSA -e '$_=shift; substr($_,int(rand(1+length)),0,shift); print' "$a" "$b"

여기서 1+length의 위치는 문자열의 시작 부분과 각 문자 뒤입니다.

ETA: 예, -CSA명령줄 인수와 표준 출력(다른 표준 파일 핸들 포함)을 지정하면 UTF-8(멀티바이트)이 사용됩니다.

관련 정보