Когда необходимо добавить обратную косую черту перед точкой при использовании sed

Ваш вклад:

$ 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 .

-2
16.12.2019, 10:02
1 ответ

Вам нужно экранировать точку только в том случае, если она является частью регулярного выражения и должна соответствовать буквальной точке. Чтобы сопоставить литеральную точку с регулярным выражением, вы можете использовать \.или [.].

Замещающая часть выражения sв sed, однако, не является регулярным выражением.

Единственными символами, которые должны быть экранированы там (с обратной косой чертой ), являются \, &, новая строка и разделитель команд s(/при использованииs/pattern/replacement/).

Это означает, что ваша команда

sed "s/hostname=localhost/hostname=$machine.$domain/g"  ambari-agent.ini

будет работать, если значения задействованных переменных соответствуют вышеупомянутым -упомянутым правилам. Лично я бы дополнительно привязал выражение к началу строки и снял флаг gс команды s.

1
28.01.2020, 05:16

Теги

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