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

时间:2015-05-18 13:57:11

标签: regex perl shell sh

我需要将foo,bar变成

BAZ(foo) \
BAZ(bar)

\按原样存在。

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

BAZ(foo) \
BAZ(bar) \

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

<强>输出

BAZ(foo) \
BAZ(bar)

答案 2 :(得分:1)

使用awk即可:

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

或使用sed

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

答案 3 :(得分:0)

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

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