所以讓我們說我有這句話
It's {raining|snowing|cold} outside
我想要的是在括號之間隨機提取一個單詞,這是我所做的awk -vRS="}" -vFS="|" '{print $2}'(仍在努力隨機提取它們)。輸出通常是第二個字,在我們的例子中snowing。
問題是輸出只是snowing,而我想要的實際輸出是類似的It's snowing outside,那么如何從括號中提取任何單詞并僅替換為一個單詞。
uj5u.com熱心網友回復:
在每個 Unix 機器上的任何 shell 中使用任何 awk:
$ 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
有關隨機性的詳細資訊,請參閱rand()(和srand())https://www.gnu.org/software/gawk/manual/gawk.html#Numeric-Functions。
uj5u.com熱心網友回復:
由于您需要通過替換字串的一部分來重寫字串,因此正則運算式是一種合適的方法
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;
該/e修飾符使其將替換側作為代碼進行評估,并將生成的值用作替換。所以在那里我們運行一個選擇發生的子程式。這也是后期改進/更改的好方法,通過編輯子實作。
@choices使用rand選擇陣列的一個元素。在標量背景關系中計算其上限的運算式,因此我們可以直接使用@choices陣列,因為它的長度最終被使用。
uj5u.com熱心網友回復:
一個有趣的解決方案是(ab)使用 Perl 的glob函式來生成可能組合的串列。需要注意的是,您不能在字串中使用 glob 元字符。例如:
use strict;
use warnings;
use Data::Dumper;
use feature 'say';
my $str = "It's {freaking|fudging} {raining|snowing|cold} outside";
$str =~ s#({[^}] })#$1 =~ s/\|/,/gr#ge; # replace | with , inside curly braces
my @list = glob $str;
print Dumper \@list;
say "Our random string: " . $list[ int rand(@list) ];
輸出:
$VAR1 = [
'It\'s freaking raining outside',
'It\'s freaking snowing outside',
'It\'s freaking cold outside',
'It\'s fudging raining outside',
'It\'s fudging snowing outside',
'It\'s fudging cold outside'
];
Our random string: It's fudging cold outside
uj5u.com熱心網友回復:
使用 jq它是單行的:
echo "It's {raining|snowing|cold} outside" | \
jq -rR --argjson rand $RANDOM 'gsub("{(?<words>[^}] )}"; .words | split("|") | .[$rand % length])'
uj5u.com熱心網友回復:
echo "It's {raining|snowing|cold} outside" | perl -ple 's/\{(.*)\}/(split "[|]", $1)[rand(3)]/e'
或對于任意數量的天氣條件:
echo "It's {raining|snowing|cold} outside" | perl -ple 's/\{(.*)\}/@a=split "[|]", $1; $a[rand(@a)]/e'
uj5u.com熱心網友回復:
echo "It's {raining|snowing|cold} outside"|awk -F"[{|}]" -v w="$(shuf -i 2-4 -n 1)" '{print $1$w$NF}'
uj5u.com熱心網友回復:
簡單來說bash,不使用任何外部命令:
#!/bin/bash
while read -r line; do
if [[ $line =~ (.*)\{([^}]*)}(.*) ]]; then
IFS='|' read -ra words <<< "${BASH_REMATCH[2]}"
line=${BASH_REMATCH[1]}${words[RANDOM%${#words[*]}]}${BASH_REMATCH[3]}
fi
printf '%s\n' "$line"
done < file
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/397190.html
