如何用Perl忽略多行字符串中的最后一个换行符



我需要把foo,bar变成

BAZ(foo) 
BAZ(bar)

按原样存在。

我尝试使用echo 'foo,bar' | tr , 'n' | perl -pe 's/(.*)n/BAZ($1) \n/g',但产生

BAZ(foo) 
BAZ(bar) 

所以,这要么是一个完全错误的方法,要么我需要一种方法来忽略Perl多行字符串中的最后一个换行符。

echo 'foo,bar' | perl -ne'print join " \n", map "BAZ($_)", /w+/g'

BAZ(foo) 
BAZ(bar)

您可以使用joinmap,如下所示:

$ echo 'foo,bar' | perl -F, -lape '$_ = join(" \n", map { "BAZ(" . $_ . ")" } @F)'
BAZ(foo) 
BAZ(bar)
  • -a启用自动分割模式,使用,分隔符分割输入并将其分配给@F
  • map获取数组的每个元素并对其进行包装
  • join在每个元素之间添加反斜杠和换行符

使用awk可以做到:

s='foo,bar'
awk -F, '{for (i=1; i<=NF; i++) printf "BAZ(%s) %sn", $i, (i<NF)? "\" : ""}' <<< "$s"
BAZ(foo) 
BAZ(bar)

或者使用sed:

sed -r 's/([^,]+)$/BAZ(1)/; s/([^,]+),/BAZ(1) \n/g' <<< "$s"
BAZ(foo) 
BAZ(bar)

使用eof来检测您是否在最后一行:

echo 'foo,bar' | tr , 'n' | perl -pe 'my $break = (eof) ? "" : "\"; s/(.*)n/BAZ($1) $breakn/g'

最新更新