{ printf '[13*%d-n[bs]pc]s%c\n' 9 a 7 b 5 c 3 d 1 e
tr -s ' \n' lx <file.txt; } | dc |
sed -f- -eb -e:s -e's/.*/\\textbf{&}/' exam.txt
Использует калькулятор обратной полировки dc
для создания сценария sed
, который выглядит так:
8bs
17bs
... который затем объединяется со сценариями sed
, введенными в командной строке, и поэтому каждый номер строки, который не включен в сгенерированный сценарий, будет ] b
удален, а для тех, которые включены , строка \ textbf {
вставлена перед тем, что существует в строке, и }
добавлено к его хвосту.
Конечно, это будет работать не только для двух разделов. Обычно он умножает начальное число в каждой строке в file.txt
на 13, а затем вычитает из произведения 1, 3, 5, 7, 9 для любого из e, d, c, b, a соответственно, чтобы приходят к списку целевых номеров строк.
В любом случае, все, что sed
должен сделать в конце, - это печать по умолчанию, которую он выполняет для каждой строки, которую он не редактирует до разветвления, или же выполнить одну замену для вашей строки . tr
и dc
являются очень быстрыми утилитами, и они выполняют почти всю предварительную обработку.
Возможные преимущества этого подхода:
Нет необходимости проводить сравнения между двумя файлами.
Сопоставление регулярных выражений не требуется.
Хотя это правда, обработка sed
может немного выиграть от начального дополнительного фильтра, чтобы предотвратить попытки сопоставления каждого номера строки с номерами в списке, например:
... | sed -e '/ ^ [ABCDE] /! b' -f- ...
Ответы в file.txt не обязательно должны быть в каком-либо определенном порядке или даже полностью представлять все вопросы в exc.txt .
Возможные недостатки:
Каждая ответная буква в file.txt должна быть в нижнем регистре.
tr -s '[: upper:] \ n' \ [: lower:] lx
для обработки либо / или. Между номером ответа и буквой ответа и между каждым ответом, соответственно, в file.txt требуется как минимум один промежуточный пробел и промежуточная новая строка, хотя допускается любое большее число, за исключением того, что в начале нет пробела -строчки можно найти перед первым ответом, и ни одна строка не может начинаться или заканчиваться пробелами.
Каждый блок вопросов / ответов на экзамене .txt должен состоять ровно из 13 строк (за исключением последней, которая не должна содержать завершающую пустую строку) .
Это зависит от одного или двух написанных расширений GNU dc
. Вот более переносимая версия:
{ printf '[13*%d-p[s]pc]s%c\n' 9 a 7 b 5 c 3 d 1 e
tr -s ' \n' lx <file.txt;}| dc | paste -db - -|
sed -f- -eb -e:s -e's/.*/\\textbf{&}/' exam.txt
... в любом случае, вы это пишете:
\item
Which of the following lorem ipsun are the best playstation games you have played?
A Pattman
B Pokemon
\textbf{C Lorem}
D Ipsun
E Heillui
\item
Which of the following lorem ipsun are the best playstation games you have played?
\textbf{A Pattman}
B Pokemon
C Lorem
D Ipsun
E Heillui
Простойawk
+xargs
подход:
awk '{ print $2 }' file | xargs -n1 rm
С awk
и его функцией system()
.
awk '{ system("echo rm "$2) }' list
Вышеупомянутое верно, если у вас не будет пробелов в имени вашего файла, если вместо этого вы попробуете ниже.
awk '{gsub(/^.*: | exists in filesystem$/,""); system("echo rm \"" $0"\"")}' list
Обратите внимание, что ни один из вышеперечисленных способов не сможет обнаружить символы новой строки в имени файла, если таковые имеются.
Снимите echo
, чтобы выйти из -сухого хода.
В дополнение к другим ответам:
У вас пути к файлам содержат пробелы? Если да, то с ним нужно правильно обращаться. Попробуйте использовать эту команду, чтобы получить правильные пути к файлам с помощью GNU sed:
sed -r 's/^.*: (.*)/\1/;s/^(.*) exists in filesystem$/\1/' file
Или POSIX:
sed -e 's/^.*: \(.*\)/\1/' -e 's/^\(.*\) exists in filesystem$/\1/' file
Если у вас есть такой файл:
foo: /some/long/path_with_underscores-and-hyphens/andnumbers1.ext exists in filesystem
foo: /another/one.ext exists in filesystem
bar: /another/path/and/file.2 exists in filesystem
123 ret: /another/path/and/file 2 exists in filesystem
123 ret: /another/space path/and/file 2 exists in filesystem
Ваш вывод будет:
/some/long/path_with_underscores-and-hyphens/andnumbers1.ext
/another/one.ext
/another/path/and/file.2
/another/path/and/file 2
/another/space path/and/file 2
Чтобы удалить файл, используйте xargs
, как указано выше, но с опцией -d
:
sed pattern | xargs -n1 -d '\n' rm