Заменить символы UTF-8 на оболочку perl

Обратные кавычки `...` добавляют уровень косвенности, для которого требуется еще один набор экранирований \ . Если вы используете вместо него $ (...) , он работает правильно и, как ожидалось:

myvar=$(echo testdir=/tmp/testing | sed 's/\//\\\//g')
echo "$myvar"
testdir=\/tmp\/testing

Если вы настаиваете на использовании обратных кавычек, это сработает:

myvar=`echo testdir=/tmp/testing | sed 's/\//\\\\\//g'`
echo "$myvar"
testdir=\/tmp\/testing
6
02.04.2018, 22:49
3 ответа

Используйте это:

 $ echo 'ABCæøåDEF' |
    perl -CSD -Mutf8 -pe 's/([æøå])/[$1]/g'

Работает также для файлов

Выход:

ABC[æ][ø][å]DEF

Примечание:

  • замены:\\1для , \1для и в мы используем$1
  • проверить perldoc perlrunна наличие -CSDприемов utf8
8
27.01.2020, 20:27

$ echo 'ABCæøåDEF' | perl -CS -Mutf8 -pe 's/ ([æøå] )/[$1]/g'

-2
27.01.2020, 20:27

Ваш вклад:

$ cat input.txt 
ABCæøåDEF
$ hexdump -C input.txt 
00000000  41 42 43 c3 a6 c3 b8 c3  a5 44 45 46 0a           |ABC......DEF.|
0000000d

Одним из хороших способов IMO является опция-Cплюсutf8:

$ perl -CSD -Mutf8 -pe 's/([æøå])/[$1]/g' input.txt 
ABC[æ][ø][å]DEF
$ cat input.txt | perl -CSD -Mutf8 -pe 's/([æøå])/[$1]/g'
ABC[æ][ø][å]DEF

Если вы не хотите использовать UTF -8 в командной строке, вы всегда можете написать свой код Perl в простом ASCII и использовать escape-последовательности, такие как \xAB, \x{ABCD}или в более новом Perls \N{U+ABCD}. ] или\N{CHARNAME}:

$ perl -CSD -pe 's/([\xE6\xF8\xE5])/[$1]/g' input.txt 
ABC[æ][ø][å]DEF
$ cat input.txt | perl -CSD -pe 's/([\xE6\xF8\xE5])/[$1]/g'
ABC[æ][ø][å]DEF

Это немного креативно:@ARGVбудет интерпретироваться как UTF -8, поэтому вы можете сохранить исходный код в виде ASCII и передать UTF -8 символов через аргумент командной строки (не обязательно лучшее решение, просто показывающее, как вы можете использовать опцию -CA):

$ perl -CSDA -pe 'BEGIN{$p=shift;} s/($p)/[$1]/g' '[æøå]' input.txt 
ABC[æ][ø][å]DEF
$ cat input.txt | perl -CSDA -pe 'BEGIN{$p=shift;} s/($p)/[$1]/g' '[æøå]'
ABC[æ][ø][å]DEF

Или, конечно, вы всегда можете превратить анлайнер в реальный скрипт, где вы можете

use warnings;
use 5.012;
use utf8;
use open qw/:std :encoding(UTF-8)/;
use charnames qw/:full :short/;

Дальнейшее чтение:perlunitut , perlunifaq , perluniintro , perlunicode , perlunicook .

1
27.01.2020, 20:27

Теги

Похожие вопросы