así que digamos que tengo esta oración
It's {raining|snowing|cold} outside
Lo que quiero es extraer aleatoriamente una palabra entre corchetes, lo que hice con awk -vRS="}" -vFS="|" '{print $2}' (sigue trabajando para extraerlos aleatoriamente). La salida suele ser la segunda palabra, en nuestro caso snowing .
La cuestión es que la salida solo está snowing , y la salida real que quiero es algo así como It's snowing outside , entonces, ¿cómo extraigo cualquier palabra de los paréntesis y la reemplazo con una sola palabra?
Dado que necesita reescribir una cadena encontrando y reemplazando una parte de ella, la expresión regular es adecuada
use warnings; use strict; use feature 'say'; sub pick_one { my ($pattern) = @_; my @choices = split /\|/, $pattern; return $choices[int rand @choices]; } my $sentence = q(It's {raining|snowing|cold} outside); $sentence =~ s/\{ ( [^}]+ ) \}/pick_one($1)/ex; say $sentence; Ese modificador /e hace que evalúe el lado de reemplazo como código, y el valor producido luego se usa como reemplazo. Así que ejecutamos un sub en el que ocurre la elección. Tener esto en un sub es una buena forma de refinamientos/cambios posteriores, implementados en el sub.
Un elemento de la matriz @choices se selecciona usando rand . Una expresión para su límite superior se evalúa en el contexto escalar, por lo que podemos usar directamente la matriz @choices , ya que luego se termina usando su longitud.
echo "It's {raining|snowing|cold} outside" |\ perl -pe 's/\{(.*?)\}/(split("[|]",$1)[rand(3)]/e'o para un número arbitrario de condiciones climáticas:
echo "It's {raining|snowing|cold} outside" |\ perl -pe 's/\{(.*?)\}/@a=split("[|]",$1); $a[rand(@a)]/e'Usando cualquier awk en cualquier shell en cada caja de Unix:
$ cat tst.awk BEGIN { srand() } match($0,/\{[^}]+}/) { wordList = substr($0,RSTART+1,RLENGTH-2) numWords = split(wordList,words,/[|]/) wordNr = int(rand() * numWords + 1) $0 = substr($0,1,RSTART-1) words[wordNr] substr($0,RSTART+RLENGTH) } { print } $ awk -f tst.awk file It's snowing outside $ awk -f tst.awk file It's cold outside Consulte rand() (y srand() ) en https://www.gnu.org/software/gawk/manual/gawk.html#Numeric-Functions para obtener detalles sobre su aleatoriedad.