Regex AWK:用重复次数替换数字

Regex AWK:用重复次数替换数字,regex,awk,numbers,repeat,backreference,Regex,Awk,Numbers,Repeat,Backreference,我有一个问题,假设我有: up2left3right 我想使用awk将其更改为: up up left left left right 有没有关于如何做到这一点的想法? 提前谢谢 这是一个gnu awk版本(由于RS和RT) 这是一个gnuawk版本(由于RS和RT) 以下是常规awk的可能方法: $ echo "up2left3right1wrong2boo" | awk '{x=gsub(/[0-9]+/," & ");for(i=1;i<=x*2;i+=2){whi

我有一个问题,假设我有:

up2left3right
我想使用awk将其更改为:

up
up
left
left
left
right
有没有关于如何做到这一点的想法?
提前谢谢

这是一个
gnu awk
版本(由于
RS
RT


这是一个
gnuawk
版本(由于
RS
RT


以下是常规
awk
的可能方法:

$ echo "up2left3right1wrong2boo" | 
awk '{x=gsub(/[0-9]+/," & ");for(i=1;i<=x*2;i+=2){while($(i+1)--)print $i};if(i)print $i}'
up
up
left
left
left
right
wrong
wrong
boo

以下是常规
awk
的可能方法:

$ echo "up2left3right1wrong2boo" | 
awk '{x=gsub(/[0-9]+/," & ");for(i=1;i<=x*2;i+=2){while($(i+1)--)print $i};if(i)print $i}'
up
up
left
left
left
right
wrong
wrong
boo

另一种选择是使用
perl

$ echo up2left3right | perl -pe 's/([A-Za-z]+)(\d+)/"$1\n" x $2/gse;'
up
up
left
left
left
right
现在计数大于10时:

$ echo up2down10left2right | perl -pe 's/([A-Za-z]+)(\d+)/"$1\n" x $2/gse;'
up
up
down
down
down
down
down
down
down
down
down
down
left
left
right

另一种选择是使用
perl

$ echo up2left3right | perl -pe 's/([A-Za-z]+)(\d+)/"$1\n" x $2/gse;'
up
up
left
left
left
right
现在计数大于10时:

$ echo up2down10left2right | perl -pe 's/([A-Za-z]+)(\d+)/"$1\n" x $2/gse;'
up
up
down
down
down
down
down
down
down
down
down
down
left
left
right


@约特,1。回答得好。今天我学到了一个新的变量
RT
+1很好的答案。我的OSX Mac上没有GNU awk。这是否处理“up12left22”和两位数字段?那么OP的流中会发生这样的事情吗?@MarkSetchell很好,我认为
RS=“[0-9]+”
会解决它,但它不会。不管怎么说,你有没有想过要在你的mac电脑上安装。真的很酷@jaypal的另一个选择是使用perl。它不会受到限制。@user2849420欢迎使用StackOverflow。点击答案旁边的复选标记表示感谢。@Jotne,+1。回答得好。今天我学到了一个新的变量
RT
+1很好的答案。我的OSX Mac上没有GNU awk。这是否处理“up12left22”和两位数字段?那么OP的流中会发生这样的事情吗?@MarkSetchell很好,我认为
RS=“[0-9]+”
会解决它,但它不会。不管怎么说,你有没有想过要在你的mac电脑上安装。真的很酷@jaypal的另一个选择是使用perl。它不会受到限制。@user2849420欢迎使用StackOverflow。点击答案旁边的复选标记表示感谢。@jaypal I在使用循环之前对使用循环的人是否定的,如果有其他解决方案,但从其他解决方案和测试中了解到,带循环的
awk
甚至可能比不带循环的
awk
更快。所以循环并不自动等于慢解决方案。@Jotne-True,我刚才是在
perl
提供的更干净的代码的上下文中说的。你不会经常看到这种情况发生<代码>;)+1表示非常好的解决方案。你能用perl解释一下我们这些新手的行为吗?我可以“玩”你的解决方案,但不能真正理解它。@fedorqui
x
e
将右侧作为表达式计算。其思想是匹配字符串和数字,并使用数字乘以字符串@jaypal I之前对使用循环的人持否定态度,如果有其他解决方案,但通过测试从其他人那里了解到,带循环的
awk
甚至可能比不带循环的
awk
更快。所以循环并不自动等于慢解决方案。@Jotne-True,我刚才是在
perl
提供的更干净的代码的上下文中说的。你不会经常看到这种情况发生<代码>;)+1表示非常好的解决方案。你能用perl解释一下我们这些新手的行为吗?我可以“玩”你的解决方案,但不能真正理解它。@fedorqui
x
e
将右侧作为表达式计算。其思想是匹配字符串和数字,并使用数字乘以字符串<代码>对错这将破坏任何解决方案。计算机就是一台计算机,按照它的指令去做。当然,你可以添加一本字典,然后进行交叉匹配,看看是否能找到可读的单词:)@Jotne是的,不知道我为什么选择给出那个免责声明。这肯定会阻止一些选票的上升<代码>:)。另一个小想法。我会看看是什么造成了这个愚蠢的输入,然后修复它,所以每个单词都在单独的一行,后面有数字要重复。但解决这个问题很有意思,因为这是我以前没见过的:)@Jotne肯定很有意思。了解了内置的
RT
的有用性和局限性如果您有一个regex as
RS
RT
将包含用于此目的的实际数据。这里有一个例子。移除标记并打印数据:
echo“somethingmore数据”| awk'RT==“RS=”
RightError
这将破坏任何解决方案。计算机就是一台计算机,按照它的指令去做。当然,你可以添加一本字典,然后进行交叉匹配,看看是否能找到可读的单词:)@Jotne是的,不知道我为什么选择给出那个免责声明。这肯定会阻止一些选票的上升<代码>:)。另一个小想法。我会看看是什么造成了这个愚蠢的输入,然后修复它,所以每个单词都在单独的一行,后面有数字要重复。但解决这个问题很有意思,因为这是我以前没见过的:)@Jotne肯定很有意思。了解了内置的
RT
的有用性和局限性如果您有一个regex as
RS
RT
将包含用于此目的的实际数据。这里有一个例子。移除标记并打印数据:
echo“somethingmore数据”| awk'RT==“RS=”
$ echo up2down10left2right | perl -pe 's/([A-Za-z]+)(\d+)/"$1\n" x $2/gse;'
up
up
down
down
down
down
down
down
down
down
down
down
left
left
right