Добавьте два 256-битных шестнадцатеричных числа в bash?

{   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
-1
26.03.2018, 09:05
3 ответа

Простойawk+xargsподход:

awk '{ print $2 }' file | xargs -n1 rm
0
28.01.2020, 05:12

С awkи его функцией system().

awk '{ system("echo rm "$2) }' list

Вышеупомянутое верно, если у вас не будет пробелов в имени вашего файла, если вместо этого вы попробуете ниже.

awk '{gsub(/^.*: | exists in filesystem$/,""); system("echo rm \"" $0"\"")}' list

Обратите внимание, что ни один из вышеперечисленных способов не сможет обнаружить символы новой строки в имени файла, если таковые имеются.

Снимите echo, чтобы выйти из -сухого хода.

0
28.01.2020, 05:12

В дополнение к другим ответам:

У вас пути к файлам содержат пробелы? Если да, то с ним нужно правильно обращаться. Попробуйте использовать эту команду, чтобы получить правильные пути к файлам с помощью 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
0
28.01.2020, 05:12

Теги

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