Подайте заявку замена объекта внутри перечисляют в Perl regex?

Оболочка интерпретирует командную строку с определенными правилами, которые необходимо рассмотреть здесь:

  • Можно выйти из метасимволов оболочки с \так, чтобы это вело себя как обычный символ.

  • Можно использовать одинарные или двойные кавычки и в них большинство (с двойными кавычками) или все (с одинарными кавычками), метасимволы оболочки теряют свое особое значение.

  • Кавычки не должны быть на границах слова, так, чтобы rm th"is fil"e совпал бы с rm "this file".

  • Символы []? * может использоваться для расширения имени файла. Им нельзя заключить в кавычки или оставить с этой целью.

Таким образом, возможные решения для Вашего случая rm -rf '('*, rm -rf "("* и rm -rf \(*. Я не знаю, почему последний не работал в Вашем случае. Возможно, существует некоторый пробел перед круглой скобкой?

Со следующей строкой необходимо смочь видеть, существуют ли какие-либо забавные символы в именах файлов:

for i in *; do od -c <<< "$i"; done
2
13.04.2017, 15:36
3 ответа

Вы можете использовать оператор .. или range чтобы ограничить подстановки начальными / конечными разделами:

while (<DATA>) {
   if ( /\\begin/ .. /\\end/ ) {
       s/^(?!\\)/\\item /;  
   }
   print;
}

__DATA__
7. Masi is the same as
\begin{enumerate}
A
B
ABC ha lorem
\end{enumerate}

1. ABC is
\begin{enumerate}
P
B
Lorem maam
\end{enumerat

Если вы предпочитаете сценарий командной строки:

perl -ne 'if (/\\begin/../\\end/) {s/^(?!\\)/\\item /};print'

Или, короче, с неявной печатью :

perl -pe 'if (/\\begin/../\\end/) {s/^(?!\\)/\\item /}'

(?!. ..) - утверждение с отрицательным прогнозом.

4
27.01.2020, 21:50

Использовать флаг . Установите его в 1 при вводе enumerate, очистите его в конце. Вставить элемент, когда установлен флаг:

perl -pe '$inside = 0 if /\\end{enumerate}/;
          print "\\item " if $inside;
          $inside = 1 if /\\begin{enumerate}/;
         ' input.tex

Обратите внимание, что я проверяю конец перед печатью, поэтому \ item не добавляется к конечной строке.

2
27.01.2020, 21:50

Другое Perl решение:

$ perl -pe '
    if (/\\begin/../\\end/) {
        next if /\\begin/ || /\\end/;
        s/^/\\item /;
    }
' file
7. Masi is the same as
\begin{enumerate}
\item A
\item B
\item ABC ha lorem
\end{enumerate}

1. ABC is
\begin{enumerate}
\item P
\item B
\item Lorem maam
\end{enumerate}

пояснение

  • if (/\\\begin/../\\\end/): наш разделитель строк начинается с \begin и заканчивается \end.
  • next if /\\\begin/ || /\\end/: нам не нужны начало и конец, пропустите их.
  • s/^/\\\\item /: заменяем начало каждой строки на нужный нам шаблон.
  • -p опция заставляет perl печатать каждую строку после того, как мы ее обработали.
3
27.01.2020, 21:50

Теги

Похожие вопросы