我的文件包含以下字符串:
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
答案 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