Ваш вклад:
$ 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 .
Вам нужно экранировать точку только в том случае, если она является частью регулярного выражения и должна соответствовать буквальной точке. Чтобы сопоставить литеральную точку с регулярным выражением, вы можете использовать \.
или [.]
.
Замещающая часть выражения s
в sed
, однако, не является регулярным выражением.
Единственными символами, которые должны быть экранированы там (с обратной косой чертой ), являются \
, &
, новая строка и разделитель команд s
(/
при использованииs/pattern/replacement/
).
Это означает, что ваша команда
sed "s/hostname=localhost/hostname=$machine.$domain/g" ambari-agent.ini
будет работать, если значения задействованных переменных соответствуют вышеупомянутым -упомянутым правилам. Лично я бы дополнительно привязал выражение к началу строки и снял флаг g
с команды s
.