мульти поиск и замена с помощью sed или аналогичных команд в среде Unicode - PullRequest
0 голосов
/ 07 января 2019

У меня есть файлы * .txt, места в каталоге c: \ apple и его подкаталогах в среде WINDOWS 7. например:

c:\apple\orange
c:\apple\pears ....etc

но число подпапок в c: \ apple неизвестно

и у меня есть текстовый файл (скажем, sample.txt), который чем-то похож на файл конфигурации, структура:

綫 綫
胆 胆
湶 湶
峯 峯

один пробел между китайским символом и строкой.

Я надеюсь, что смогу использовать этот файл sample.txt, чтобы найти ВСЕ текстовые файлы в подкаталогах C: \ APPLE \ и его каталогах, найти эти китайские символы и заменить их на символы после этого.

Я пробовал sed, но мне не повезло с китайскими иероглифами.

sed -r "s/^(.*) (.*)/s@\1@\2@/g" c:\temp\sample.txt *.txt

У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 08 января 2019

Если ваши текстовые файлы, включая sample.txt, закодированы в формате UTF-16LE, попробуйте:

perl -e '
use utf8;
use File::Find;

$topdir = "c:/apple";               # top level of subfolders
$mapfile = "c:/temp/sample.txt";    # config file to map character to code
$enc = "utf16le";                   # character coding of texts

open(FH, "<:encoding($enc)", $mapfile) or die "$mapfile: $!";
while (<FH>) {
    @_ = split(" ");
    $map{$_[0]} = $_[1];
}
close(FH);

find(\&process, $topdir);

sub process {
    my $file = $_;
    if (-f $file && $file =~ /\.txt$/) {
        my $tmp = "$file.tmp";
        my $lines = "";
        open(FH, "<:encoding($enc)", $file) or die "$file: $!";
        open(W, ">:encoding($enc)", $tmp) or die "$tmp: $!";
        while (<FH>) {
            $lines .= $_;           # slurp all text
        }
        foreach $key (keys %map) {
            $lines =~ s/$key/$map{$key}/ge;
        }
        print W $lines;
        close(FH);
        close(W);
        rename $file, "$file.bak";  # back-up original file
        rename $tmp, $file;
    }
}'

Я должен сказать вам, что я не тестировал код в средах выполнения Windows (он тестируется в Linux с файлами Windows). Если есть какие-то проблемы, пожалуйста, дайте мне знать. Возможно, вам придется изменить назначения на $topdir, $mapfile или $enc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...