【发布时间】:2014-10-08 04:59:38
【问题描述】:
我是 Perl 的新手,我发现了我不理解且无法解决的行为。
我正在制作一个小查找和替换程序,我需要做一些事情。我有一堆需要处理的文件。然后我有一个外部文本文件中的查找/替换规则列表。在替换那里我需要三个特别的东西:
替换 utf-8 字符(捷克变音符号)
使用添加/删除行(因此在 slurp 模式下工作)
使用正则表达式
我想要一个单独运行的程序,所以我写了它,让它接受三个参数:
- 要处理的文件
- 发现什么
- 替换什么。
我正在从一个解析规则列表并加载其他文件的 bash 脚本循环发送参数。
我的问题是当我在规则列表中有一个"\n" 字符串并将其发送到 Perl 脚本时。如果它在替换的第一部分(在查找部分),它会正确查找换行符,但是当它在第二部分(替换部分)时,它只会打印 \n 而不是换行符。
我尝试将 "\n" 硬编码到变量中,而不是从列表中传递它,然后它就可以正常工作了。
Perl 不在那里解释 "\n" 字符串的原因是什么,我怎样才能让它工作?
这是我的代码:
list.txt - 外部替换列表中的一行
1\. ?\\n?NÁZEV PŘÍPRAVKU;\\n<<K1>> NÁZEV PŘÍPRAVKU;
farkapitoly.sh - 用于解析 list.txt 并循环浏览所有文件并调用 Perl 脚本的 bash 脚本
...
FILE="/home/tmp.txt"
while read LINE
do
FIND=`echo "$LINE" | awk -F $';' 'BEGIN {OFS = FS} {print $1}'`
REPLACE=`echo "$LINE" | awk -F $';' 'BEGIN {OFS = FS} {print $2}'`
perl -CA ./pathtiny.pl "$FILE" "$FIND" "$REPLACE"
done < list.txt
...
pathtiny.pl - 用于查找和替换的 Perl 脚本
#!/usr/bin/perl
use strict;
use warnings;
use Modern::Perl;
use utf8; # Enable typing Unicode in Perl strings
use open qw(:std :utf8); # Enable Unicode to STDIN/OUT/ERR and filehandles
use Path::Tiny;
my $file = path("$ARGV[0]");
my $searchStr = "$ARGV[1]";
my $replaceStr = "$ARGV[2]";
# $replaceStr="\n<<K1>> NÁZEV PRÍPRAVKU"; # if I hardcode it here \n is replaced right away
print("Search String:", "$searchStr", "\n");
print("Replace String:", "$replaceStr", "\n\n");
my $guts = $file->slurp_utf8;
$guts =~ s/$searchStr/$replaceStr/gi;
$file->spew_utf8($guts);
如果它很重要,我在 VirtualBox 上使用 Linux Mint 13 64 位(在 Win 8.1 下)并且我有 Perl v5.14.2。每个文件都是带有 Linux 结尾的 UTF-8。
可以在pastebin 上找到示例文件。 this 应该像 this 一样结束。
但是示例差异很大。我需要一个通用的解决方案来在替换字符串中写下换行符,以便正确替换。
【问题讨论】: