是否可以制作一个(Perl 或任何在 Mac OS X 上运行的)脚本来转换
\section{long text}
\sectionmark{short text}
至
\section[long text]{long text\sectionmark{short text}}
或者替代
\section{long text}[short text]
我无法确保长文本
中没有换行符,或者\section
和\sectionmark
之间是否有换行符>.
此问题与讨论的问题相关 here TeX.SX。
最佳答案
awk '/\\section{long text}/ { oldline=$0
getline
gsub("{","[",oldline)
gsub("}","]",oldline)
print gensub("(.*)\\[(.*)\\]","\\1[\\2]{\\2","g",oldline) $0 "}"
getline
}
1' INPUTFILE
如果长文本
中没有换行符并且\section
和\sectionmark
之间没有空行,将为您执行此操作。如果您有其中任何一个,您仍然可以对其进行修改。
所以回答你的问题:是的,这是可能的。
更新
这是一个使用 awk
的可行解决方案:
awk '/\\section{/ { oldline=$0
if ( oldline ~ /}/ ) {
lt=gensub(".*{([^}]+)}.*","\\1","g",oldline)
} else {
lt=gensub(".*{(.*)","\\1","g",oldline)
getline tmp
while ( tmp !~ "}" ) {
lt=lt "\n" tmp
getline tmp
}
lt=lt "\n" gensub("}.*","","g",tmp)
}
getline
while ( $0 !~ /\\sectionmark/ ) {
getline
}
printf("\\section[%s]{%s%s}\n",lt,lt,$0)
getline
}
! /\\section{/ { print }' INPUT_FILE
注意:如果 long text}
和 \sectionmark
之间出现任何内容,它不会处理,例如:
\section{long text}**THIS TEXT WILL BE SKIPPED!!**
\sectionmark{short text}
您可以在 ACTION HERE 中看到它!
如果您想删除长文本
中的新行,只需将每个"\n"
替换为""
脚本。
关于shell - 有人可以为我提供一个简单的搜索和替换脚本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9096695/