Как вставить случайную строку в заменяемую строку sed для каждой строки? - PullRequest
1 голос
/ 31 мая 2019

Это:

echo " " | tr ' ' '\n' | sed "s|.*|$RANDOM|"

Или это:

echo " " | tr ' ' '\n' | sed "s|.*|$(echo $RANDOM)|"

Распечатает список из 5 чисел (пробел заменяется новой строкой, sed заменяет каждую строку на $ RANDOM), и эти 5 чисел будут одинаковыми :

$ echo "    " | tr ' ' '\n' | sed "s|.*|$(echo $RANDOM)|"
21590
21590
21590
21590
21590

Это потому, что замена $ RANDOM на случайное значение происходит только один раз.

Какой самый простой и короткий способ, желательно только с использованием sed, фактически вывести различное случайное число для каждой строки. т.е. чтобы обеспечить некоторый «вторичный поток ввода», который отличается для каждой строки, которую обрабатывает sed?

Я мог бы сделать это с помощью xargs, но мне интересно, есть ли способ сделать это только с помощью sed.

Ответы [ 5 ]

2 голосов
/ 31 мая 2019

Зависит от вашей версии sed, но -

$: cat x
a
b
c
d
e

$: sed 's/.*/printf "%05d\n" $RANDOM/e' x
30181
30514
24742
28555
26267

e означает e xecute и порождает подоболочку, так что будьте осторожны с ценой.

1 голос
/ 31 мая 2019

Это может работать для вас (GNU sed и Bash):

seq 5 | sed 's/.*/echo $RANDOM/e'

Это заменяет числа от 1 до 5 на echo $RANDOM и оценивает каждую строку.

N.B. GNU sed использует /bin/sh, который может быть направлен через символическую ссылку на /bin/dash, и в этом случае переменная окружения $RANDOM не будет найдена. Существуют различные способы решения этой проблемы, но, вероятно, самое простое (хотя, возможно, и опасное):

sudo ln -sf /bin/bash /bin/sh
# run sed
sudo ln -sf /bin/dash /bin/sh

Другая альтернатива:

shuf -i 1-100000 -n 5
0 голосов
/ 01 июня 2019

Нет, это невозможно сделать с помощью sed, поскольку у sed нет возможности генерировать случайные числа.В вашем опубликованном примере это даже не sed, а оболочка, генерирующая случайное число до вызова sed.Все, что видит sed - это "s|.*|21590|".

Если вы хотите сделать это, используя стандартные инструменты в любой оболочке на любом компьютере UNIX, то вы можете сделать это с любым awk:

$ echo "    " | tr ' ' '\n' | awk '{sub(/.*/,rand())}1'
0.924046
0.593909
0.306394
0.578941
0.740133

См. https://www.gnu.org/software/gawk/manual/gawk.html#Numeric-Functions для получения дополнительной информации о rand(), и я могу предоставить C & V, если вы заинтересованы в поиске решения awk.

0 голосов
/ 31 мая 2019

Вопрос:

Какой самый простой и короткий способ, предпочтительно , только с использованием sed, чтобы фактически напечатать другое случайное число для каждой строки?

Ответ:

echo "    " | tr ' ' '\n' | perl -pe 's|.*|int(rand(89999))+10000|e'

или просто:

perl -e 'printf "%05s\n",int(rand(100000)) for (1..5)'

Объяснение:

Не знаюЯ не понимаю, почему не следует использовать Perl или какой-либо инструмент, который, возможно, больше подходит для этой работы.В ОП нет никаких намеков на то, что нужно придерживаться sed, что, наоборот, обозначается только как предпочтение.

Интересно, почему нужно выполнить замену, чтобы напечатать пять случайных чисел?Подробная информация о картине не приводится, но она, безусловно, вызывает у меня любопытство.

0 голосов
/ 31 мая 2019

Если вам нужно одно и то же случайное число

random=$(cat /dev/urandom | tr -cd '0-9' | head -c 5)
echo -e "$random\n$random\n$random\n$random\n$random"

Если вы хотите, чтобы каждый раз было другое число.Проблема здесь в том, что сложнее установить, сколько символов вы получите

echo -e "$RANDOM\n$RANDOM\n$RANDOM\n$RANDOM\n$RANDOM"

Или более логически для того же числа

random=$(cat /dev/urandom | tr -cd '0-5' | head -c 8)
x=0
while (($x < 5)); do echo "$random";((x++));done

или более логически для другого числа

x=0
while (($x < 5)); do random=$(cat /dev/urandom | tr -cd '0-5' | head -c 8); echo "$random";((x++));done
...