可以为我提供一个简单的搜索和替换脚本吗?

时间:2012-02-01 13:38:40

标签: shell replace

是否可以制作(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之间是否有中断。

此问题与here和TeX.SX。

讨论的问题有关

2 个答案:

答案 0 :(得分: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之间没有空行,则会为您执行此操作。如果你有任何这些,你仍然可以修改它。

所以回答你的问题:是的,这是可能的。

<强>更新

这是一个有效的解决方案,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"替换每个" "

答案 1 :(得分: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]
相关问题