Intereting Posts
Удаление Endless OS для установки Fedora Проблема 2038 года Другой вопрос awk (ward) – подстановка подстроки с несколькими ключами LUKS: изменить мастер-ключ Печать строк с нечетными номерами, печать строк с четными номерами Путаница относительно конфигурации # прерываний на расширителе PCA9555 Невозможно получить фактический подсчет строк из-за возврата каретки в значения: Почему процесс убит, а большая часть памяти свободна? Вставка строки в файл только в том случае, если эта строка еще не является частью файла Незначительное изменение команды для компиляции программы на C ++ вызывает ошибку Настройка переключателя ssh-only Как удалить пунктирное подчеркивание из гиперссылок в Gnome Terminal Apparmor: разрешает ли функция разрешения жалобы dac_override? Простая эффективная конкатенация файлов CSV Как изменить программы, используемые для обработки файлов в Caliber в Debian

Как передать эти абзацы в формат MCQ?

Мои данные:

Question Nr. 311 Main proteins are in the lorem ipsun A Lorem RNA test B Cells C Metoclom D Cells E Muscles Question Nr. 312 Main proteins are in the lorem ipsun A Lorem B Cells C Metoclom D Cells E Muscles ... 

Требуемый формат:

 \item Main proteins are in the lorem ipsun A Lorem RNA test B Cells C Metoclom D Cells E Muscles \item Main proteins are in the lorem ipsun A Lorem B Cells C Metoclom D Cells E Muscles \item ... 

Где я планирую представить варианты каждый на новой строке.

Моя попытка:

 sed s/Question Nr.*/\item/g 

Который должен заменить все строки, имеющие Question Nr [что-нибудь на линии] – проблема заключается в обнаружении того, что происходит после, так как может быть много вариантов, но конец опций – \n\n т. Е. Новая строка.

Проблема полустациона:

 \item Main proteins are in the lorem ipsun A Lorem RNA test B Cells C Metoclom D Cells E Muscles \item Main proteins are in the lorem ipsun A Lorem B Cells C Metoclom D Cells E Muscles 

Другие проблемы

  • Использовать в вариантах капитализированные слова, такие как ВИЧ и РНК ; некоторые решения ниже вставляют пустую строку после HI и RN

Как вы можете получить мой желаемый результат sed / perl ?

Другой способ: tr + sed :

 tr -s \\n <infile | sed '$!G;s/Question Nr.*/\\item/' 

tr сжимает все символы новой строки, а затем sed добавляет содержимое пробела (пустую строку новой строки) в каждую строку, кроме последней, заменяя « Question Nr.* на « \item . С помощью этого метода вы не сможете редактировать файл на месте. Я выбрал tr здесь, так как это быстрее, чем регулярное выражение sed (даже если оно не так чисто, как sed единственное решение)

С sed :

 sed 's/^Question Nr\..*/\\item/; s/^\([AZ] .*\)/\n\1/' file 
  • Первый s/// заменяет Question Nr. с \item подобным команде sed в вашем вопросе.
  • Второй заменяет строку, начинающуюся с заглавной буквы от A до Z , но только с последующим пробелом. Вся эта строка заменяется на себя \1 пересматривая новую строку \n .

Выход:

 \item Main proteins are in the lorem ipsun A Lorem B Cells C Metoclom D Cells E Muscles \item Main proteins are in the lorem ipsun A Lorem B Cells C Metoclom D Cells E Muscles 

Если это не требуется, Perl's «режим абзаца» идеально подходит для этого. От man perlrun :

  -0[octal/hexadecimal] specifies the input record separator ($/) as an octal or hexadecimal number. [...] The special value 00 will cause Perl to slurp files in paragraph mode. [...] 

Таким образом, использование -00 говорит perl для определения «строк» ​​как абзацев, оно использует \n\n в качестве символа конца строки. Имея это в виду, вы можете сделать что-то вроде:

 $ perl -00pe 's/Question.*/\\item/; s/[AZ] /\n$&/g;' file \item Main proteins are in the lorem ipsun A Lorem B Cells C Metoclom D Cells E Muscles \item Main proteins are in the lorem ipsun A Lorem B Cells C Metoclom D Cells E Muscles 

Первый оператор замещения заменяет любые строки, соответствующие строке Question with \item а второй добавляет новую строку перед каждой заглавной буквой, за которой следует пробел.

 sed -e'/./!d;$!G;/^Q/c\' -e'\\item' <in >out 

Это приведет к тому, что каждая пустая строка вводится, G и пустая строка выходит из удержания и добавляет ее ко всем непустым строкам, которые есть ! а не $ last и c помещать любое пространство шаблонов ^ начинающееся с символа Q в однострочную фиксированную строку \item на выходе.

При запуске на вашем примере ввода вывод:

 \item Main proteins are in the lorem ipsun A Lorem B Cells C Metoclom D Cells E Muscles \item Main proteins are in the lorem ipsun A Lorem B Cells C Metoclom D Cells E Muscles 

(без конечной пустой линии в хвосте выхода)

В переносном выражении sed -e xpression не должно заканчиваться обратная косая черта, подобная этому, и поэтому она может быть написана:

 sed -e'/./!d;$!G;/^Q/c\'"$(printf '\n\\\item')" <in >out 

Теперь с awk :

 awk '$1 ~ /[ABCDEM]/ {print $0"\n"} $1 ~ /Question/ {print "\\item"}' inputfile 

Если строка начинается с A, B, C, D, E или M (для Main), она печатает эту строку и дополнительный \n . Если строка начинается с «Question», она просто печатает \item .