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"
на " "
в скрипте.