Awk 如何非贪婪地替换一行的多个分隔字符串?

Awk 如何非贪婪地替换一行的多个分隔字符串?,awk,sed,grep,Awk,Sed,Grep,我想从相应格式化的输入字符串生成谜语 输入示例: Foo是+第一个+在+酒吧+喝酒的人。 期望输出: Foo是在那里喝一杯的人。 对于任何标准的shell工具,最简单的解决方案是什么?此awk one liner应该可以帮助您: awk -F'+' -v OFS="" 'NF>2{for(i=2;i<=NF;i+=2)gsub(/\S/,"_",$i)}7' awk-F'+'-vofs=“”NF>2{for(i=2;i2{for(i=2;i这很有效,但并不特别漂亮: sed -r

我想从相应格式化的输入字符串生成谜语

输入示例:
Foo是+第一个+在+酒吧+喝酒的人。

期望输出:
Foo是在那里喝一杯的人。


对于任何标准的shell工具,最简单的解决方案是什么?

此awk one liner应该可以帮助您:

awk -F'+' -v OFS="" 'NF>2{for(i=2;i<=NF;i+=2)gsub(/\S/,"_",$i)}7'

awk-F'+'-vofs=“”NF>2{for(i=2;i2{for(i=2;i这很有效,但并不特别漂亮:

sed -r ':a;/\+[^+]*\+/!b;s//\n&\n/;h;s/.*\n(.*)\n.*/\1/;s/\+([^+]*)\+/\1/g;s/[^ ]/_/g;G;s/(.*)\n(.*)\n.*\n/\2\1/;ta'
像这样:

$ echo "Foo was the +first+ to get a drink at +the bar+." | sed -r ':a;/\+[^+]*\+/!b;s//\n&\n/;h;s/.*\n(.*)\n.*/\1/;s/\+([^+]*)\+/\1/g;s/[^ ]/_/g;G;s/(.*)\n(.*)\n.*\n/\2\1/;ta'
Foo was the _______ to get a drink at ____ ____.
基本上是从这里“偷”来的:

你的“容易看”测试可能会因为这个问题的答案而变得…紧张

Perl:


这确实比我的好,而且看起来更容易。作为旁白:虽然问题中没有明确说明(这里可能完全不相关),但您和我的对边缘大小写和格式错误的字符串(如“X++Y”和“X++Y”)给出了不同的输出.最后
7
的用途是什么?没有它,就没有输出打印,但我无法理解它的用途。@Utku非零数字将执行默认操作:在awk中打印。7、1、100、1000在这种情况下也执行相同的操作
$ echo "Foo was the +first+ to get a drink at +the bar+." | sed -r ':a;/\+[^+]*\+/!b;s//\n&\n/;h;s/.*\n(.*)\n.*/\1/;s/\+([^+]*)\+/\1/g;s/[^ ]/_/g;G;s/(.*)\n(.*)\n.*\n/\2\1/;ta'
Foo was the _______ to get a drink at ____ ____.
$ echo "$str" | perl -pe 's/\+(.*?)\+/ ($new=$1) =~ s{\w}{_}g; $new /eg'
Foo was the _____ to get a drink at ___ ___.