2012-02-01 53 views
2

是IST可能使(Perl或Mac OS X上運行的任何)腳本轉換能爲我提供一個簡單的搜索和替換腳本嗎?

\section{long text} 
\sectionmark{short text} 

\section[long text]{long text\sectionmark{short text}} 

或替代

\section{long text}[short text] 

我不能確保long text中沒有換行符,或者在\section\sectionmark之間有中斷。

此問題與TeX.SX討論的here問題有關。

回答

2
awk '/\\section{long text}/ { oldline=$0 
           getline 
           gsub("{","[",oldline) 
           gsub("}","]",oldline) 
           print gensub("(.*)\\[(.*)\\]","\\1[\\2]{\\2","g",oldline) $0 "}" 
           getline 
          } 
    1' INPUTFILE 

會爲你做它是否有long text沒有換行和有\section\sectionmark之間沒有空行。如果你有任何這些,你仍然可以修改它。

所以要回答你的問題:是的,這是可能的。

UPDATE

這裏是一個可行的解決方案,與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

如果您想擺脫long text中的新行,只需在腳本中將"\n"替換爲" "即可。

+0

非常感謝你。你能否請求告訴我如何修改「長文本」內部是否有換行符,因爲有一些... – Tobi 2012-02-01 14:35:50

+0

這取決於它。我的paypall地址是我在gmail.com的名字。 ...確定這是一個蹩腳的笑話,但你應該付出一些努力...無論如何,我稍後更新我的答案... – 2012-02-01 19:47:36

+0

再次感謝你,這爲我節省了很多手工和時間。 「付出了一些努力」,通常我會這樣做,如果不對自己做一些研究而不問問題,並期望有人提供完整的代碼,但這次我不知道從哪裏開始搜索,因爲我從來沒有編寫過某些內容,越來越接近O :-)是否有任何資源可以像這樣的問題/任務/腳本推薦? – Tobi 2012-02-01 21:58:01

1

這可能會爲你工作:

echo -e "\section{long text\nwith\nsome\nlinefeeds}\n\sectionmark{short text\nwith\nsome\nlinefeeds}" | 
sed ':a;$!{N;ba};s/\(\\section{[^}]*}\)[\s\n]*\\sectionmark{\([^}]*\)}/\1[\2]/g' 
\section{long text 
with 
some 
linefeeds}[short text 
with 
some 
linefeeds]