Unix текстовая обработка для копирования части строки в одну строку - PullRequest
0 голосов
/ 03 апреля 2019

[Отредактировано] У меня есть файл со строками в виде:

codeToError[resources.ErrUndefined] = fmt.Errorf("1000: random string")

, которые я хочу преобразовать в:

codeToError[resources.ErrUndefined] = fmt.Errorf("%d: random string", resources.ErrUndefined)

В основном, для каждой строки в файле,Мне нужно скопировать часть строки в другое место на той же строке в файле и заменить числа в RHS на% d.Я, очевидно, не хочу копировать вставки из строк.Я знаю, что "sed" или "awk" могут помочь, но не был уверен, как.

1 Ответ

1 голос
/ 03 апреля 2019

Предполагая, что числа представлены в виде целых чисел (включая отрицательные числа), попробуйте следующее:

sed -e 's/-\{0,1\}[0-9]\{1,\}/%d/' -e 's/\([A-Za-z]\{1,\}\[\([A-Za-z]\{1,\}\)\].\{1,\}\)/\1, \2/' file

Результат:

A[xyz] = "%d: random string", xyz
A[abcd] = "%d: another random string", abcd
A[bc] = "%d: random", bc
A[bcd] = "%d: random stuff", bcd

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

[EDIT]

В соответствии с обновленным примером, попробуйте следующее:

С sed:

sed -e 's/-\{0,1\}[0-9]\{1,\}/%d/' -e 's/\([A-Za-z]\{1,\}\[\([^]]\{1,\}\)\].\{1,\}\))/\1, \2)/' file

С gawk:

gawk '$0 = gensub("(\\w+\\[([^]]+)][^0-9-]+)-?[0-9]+(.+)\)", "\\1%d\\3, \\2)", 1)' file

С Perl:

perl -pe 's/(\w+\[(.+?)].+?)-?\d+(.+)\)/\1%d\3, \2)/' file

Результат:

codeToError[resources.ErrUndefined] = fmt.Errorf("%d: random string", resources.ErrUndefined)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...