Можно ли предоставить мне простой скрипт поиска и замены, пожалуйста? - PullRequest
2 голосов
/ 01 февраля 2012

Возможно создать скрипт (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.

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012
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}

Вы можете увидеть это в ДЕЙСТВИЯ ЗДЕСЬ !

Если вы хотите избавиться от новых строк в long text, просто замените каждые "\n" на " " в скрипте.

1 голос
/ 02 февраля 2012

Это может работать для вас:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...