заменить все точки в фигурных скобках - PullRequest
0 голосов
/ 27 мая 2020

В файле a хотел бы заменить все вхождения точки в фигурных скобках на подчеркивание.

ввод

something.dots {test.test} foo.bar
another.line

ожидаемый результат

something.dots {test_test} foo.bar
another.line

Каким был бы самый простой способ достичь этого?

Ответы [ 3 ]

2 голосов
/ 27 мая 2020

Вы можете выбрать наименее уродливый sed из двух вариантов ниже:

$ cat file
something.dots {test.test} foo.bar {a.a} x
something.dots
$ sed 's|\({[^}]*\)\.\([^}]*}\)|\1_\2|g' file
something.dots {test_test} foo.bar {a_a} x
something.dots
$ sed -E 's|(\{[^}]*)\.([^}]*\})|\1_\2|g' file
something.dots {test_test} foo.bar {a_a} x
something.dots

Объяснение (я буду использовать последнюю форму, но они эквивалентны):

  • (\{[^}]*): соответствующая группа 1, состоящая из { и любого количества символов, отличных от }.

  • \.: точка.

  • ([^}]*\}): соответствующая группа 2, состоящая из любого количества символов, отличных от }, за которыми следует }.

Если найдено, замените все выражение на [Matching group 1].[Matching group 2].

1 голос
/ 27 мая 2020

самый простой способ

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

sed 'h;s/.*{//;s/}.*//;s/\./_/g;G;s/^\(.*\)\n\(.*{\).*}/\2\1}/'

@ edit - игнорировать строки без {.*}:

sed '/{.*}/!b; h;s/.*{//;s/}.*//;s/\./_/g;G;s/^\(.*\)\n\(.*{\).*}/\2\1}/'

Проверено на repl .

0 голосов
/ 27 мая 2020

Если это будет «самый простой способ» используйте AWK вместо sed, а затем:

awk -F"{|}" '$0 !~ /{.*}/{print($0)}; gsub("\.","_",$2) {print($1"{"$2"}"$3)}' file

Это заменит любое количество точек, например {test.test. test} и строки без скобок остаются без изменений.

Пояснение:

-F"{|}"                    Sets the field separator to { or }
$0 !~ /{.*}/{print($0)};   Prints lines unchanged without the {. *} 
                           pattern, "print" can be omitted as this is 
                           the default behavior
gsub("\.","_",$2)          Substitutions . to _ for field 2
{print($1"{"$2"}"$3)}      Formats and prints lines after changes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...