如何使用 Perl 忽略多行字符串中的最后一个换行符
How to ignore last newline in a multiline string with Perl
我需要把foo,bar
变成
BAZ(foo) \
BAZ(bar)
\
保持原样。
我尝试使用 echo 'foo,bar' | tr , '\n' | perl -pe 's/(.*)\n/BAZ() \\n/g'
但结果是
BAZ(foo) \
BAZ(bar) \
所以,这要么是一个完全错误的方法,要么我需要一种方法来使用 Perl 忽略多行字符串中的最后一个换行符。
使用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()/; s/([^,]+),/BAZ() \\n/g' <<< "$s"
BAZ(foo) \
BAZ(bar)
您可以将 join
与 map
一起使用,如下所示:
$ echo 'foo,bar' | perl -F, -lape '$_ = join(" \\n", map { "BAZ(" . $_ . ")" } @F)'
BAZ(foo) \
BAZ(bar)
-a
启用自动拆分模式,使用 ,
分隔符拆分输入并将其分配给 @F
map
获取数组的每个元素并将其包装起来
join
在每个元素之间添加反斜杠和换行符
使用eof
检测您是否在最后一行:
echo 'foo,bar' | tr , '\n' | perl -pe 'my $break = (eof) ? "" : "\"; s/(.*)\n/BAZ() $break\n/g'
echo 'foo,bar' | perl -ne'print join " \\n", map "BAZ($_)", /\w+/g'
输出
BAZ(foo) \
BAZ(bar)
我需要把foo,bar
变成
BAZ(foo) \
BAZ(bar)
\
保持原样。
我尝试使用 echo 'foo,bar' | tr , '\n' | perl -pe 's/(.*)\n/BAZ() \\n/g'
但结果是
BAZ(foo) \
BAZ(bar) \
所以,这要么是一个完全错误的方法,要么我需要一种方法来使用 Perl 忽略多行字符串中的最后一个换行符。
使用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()/; s/([^,]+),/BAZ() \\n/g' <<< "$s"
BAZ(foo) \
BAZ(bar)
您可以将 join
与 map
一起使用,如下所示:
$ echo 'foo,bar' | perl -F, -lape '$_ = join(" \\n", map { "BAZ(" . $_ . ")" } @F)'
BAZ(foo) \
BAZ(bar)
-a
启用自动拆分模式,使用,
分隔符拆分输入并将其分配给@F
map
获取数组的每个元素并将其包装起来join
在每个元素之间添加反斜杠和换行符
使用eof
检测您是否在最后一行:
echo 'foo,bar' | tr , '\n' | perl -pe 'my $break = (eof) ? "" : "\"; s/(.*)\n/BAZ() $break\n/g'
echo 'foo,bar' | perl -ne'print join " \\n", map "BAZ($_)", /\w+/g'
输出
BAZ(foo) \
BAZ(bar)