LINUX.ORG.RU

Замена случайного вхождения в строке.

 


0

2

Не могу сообразить, как попроще заменить случайное вхождение символа в строке. Например, случайно выбранного символа 'a' на 'b' в строке bcgdazda5_6a.

★★☆☆

Последнее исправление: xtraeft (всего исправлений: 3)
Ответ на: комментарий от anonymous

заменить случайное вхождение символа в строке

Мне казалось, что и так понятно, но поправлю стартовый пост.

xtraeft ★★☆☆
() автор топика
Ответ на: комментарий от xtraeft

Все равно непонятно. Ты хочешь один любой символ на случайном месте в строке заменить, или одно из вхождений заранее известного символа?

ddos3
()
Ответ на: комментарий от xtraeft

1) посчитай количество вхождений x
2) сгенерируй случайное число n = от 1 до x
3) поменяй n-ое вхождение

решение явно не в одну строчку, но все три пункта за минуту гуглятся

zolden ★★★★★
()
Последнее исправление: zolden (всего исправлений: 1)

если я правильно понял задачу, то вот решение влоб, не смотря на кажущуюся неоптимальность

S=«bcgdazda5_6a» ## исходная строка
RANDSYM=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 1) ## целевой случайный символ.
R=$((RANDOM % ${#S} )) ## номер заменяемого символа. случайный.
NEWSTRING=«» ## строка, в которую будет формироваться новое слово.
for (( i=0 ; i < ${#S} ; i++ )) ; do test $i -eq $R && NEWSTRING=«${NEWSTRING}${RANDSYM}» || NEWSTRING=«${NEWSTRING}${S:$i:1}» ; done

кроме вычисления RANDSYM, остальные манипуляции со строкой в т.ч. в цикле не порождают форков, так что должно быть недорого.

bl ★★★
()
Ответ на: комментарий от bl

Спасибо. Правда, RANDSYM я выбираю сам.

xtraeft ★★☆☆
() автор топика

Начать со случайного места в строке, считая её циклической. Заменить первое вхождение. Профит.

kvap
()

just for fun: xsel | sed -r "s/(.{$(xsel | sed 's/./\0\n/g' | awk '/a/ { print NR - 1 }' | shuf | head -1)})./\1b/"

anonymous
()
function data() {
  echo 'qwe  aa
asd aaaa
zxc
aaaa zxc aaaa'
}
n=`data | awk '{c+=split($0,A,"a")-1} END{print c}'`
data | awk -v c=$((RANDOM % $n)) '
/a/{
  s=""
  n=split($0,A,"a")
  for(i=1;i<n;i++)
    s=s A[i] (--c?"a":"b")
  $0=s
}
1'
anonymous
()
Ответ на: комментарий от anonymous

--c по вкусу поменять на (c-=c!=-1)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.