Обратные кавычки `...`
добавляют уровень косвенности, для которого требуется еще один набор экранирований \
. Если вы используете вместо него $ (...)
, он работает правильно и, как ожидалось:
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
$ echo 'ABCæøåDEF' | perl -CS -Mutf8 -pe 's/ ([æøå] )/[$1]/g'
Ваш вклад:
$ 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 .