使用sed

时间:2018-05-07 06:36:50

标签: regex text awk sed

我的文件包含以下字符串:

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 :(得分:2)

这可能适合你(GNU sed):

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

只关注以Author开头的行。将线条复制到保留空间,我们将需要更改的部件与我们所做的部件重新组装。删除行的前部和后部,即{之前的部分和}之后的部分。用姓氏全局切换首字母并在它们之间引入,。附加原始行,然后用新格式化的名称替换原始名称和首字母。

答案 1 :(得分:1)

严格来说,如果您的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