Переставить сложную строку с сед - PullRequest
0 голосов
/ 07 мая 2018

У меня есть файл со строками, например:

Author    = {A. Williams and  A.~G. Clarke and  M. Pourkashanian},

Мне нужно изменить инициалы после фамилии, разделяя их запятыми, как:

Author    = {Williams, A. and  Clarke, A.~G. and Pourkashanian, M.},

Все имена разделены ключевым словом and.

Как это сделать с sed?

Моя попытка

sed.exe -i "/^ *author *=/ s/(\{|and )([A-Za-z]{2,}) ([A-Za-z]\.[A-Za-z]\.)\}/\1\3 \2/g" file.bib

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Это может сработать для вас (GNU sed):

sed -r '/^Author/!b;h;s/.*\{(.*)\}.*/\1/;s/(\S+\.) (\S+)/\2, \1/g;G;s/(.*)\n(.*\{)[^}]*/\2\1/' file

Фокус только на начинающихся строках Author. Скопируйте строку в область удержания, нам понадобятся детали, которые мы не меняем, чтобы собрать их с деталями, которые мы делаем. Снимите переднюю и заднюю часть линии, т.е. детали до { и детали после }. Глобально переключите инициалы с фамилией и введите , между ними. Добавьте исходную строку, а затем замените исходные имена и инициалы новыми отформатированными.

0 голосов
/ 07 мая 2018

Строго говоря, если ваш Input_file такой же, как показано в примере, то вам могут помочь следующие.

awk -F"= " -v s1=", " '{printf $1 OFS FS OFS "{";gsub(/}|{|,$/,"",$2);;num=split($2,array," and ");for(i=1;i<=num;i++){split(array[i],array2," ");printf("%s%s",array2[2] s1 array2[1],i!=num?" and ":"")}print "},"}' OFS="\t"   Input_file

Теперь добавляем не одну линейную форму решения.

awk -F"= " -v s1=", " '{
  printf $1 OFS FS OFS "{";
  gsub(/}|{|,$/,"",$2);
  num=split($2,array," and ");
  for(i=1;i<=num;i++){
    split(array[i],array2," ");
    printf("%s%s",array2[2] s1 array2[1],i!=num?" and ":"")}
  print "},"
}' OFS="\t"  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...