Объяснение, необходимое на то, как я могу повторить символ в SCOLL POSIX

grep соответствует строкам ввода. Если вы хотите сопоставить несколько строк, используйте другую утилиту. Например, используйте pcregrep :

pcregrep -M "T12345 .{1,100}[\n\r].{1,100}2014.03.04" filename

Это даст:

31/01/2014 11:15:40 |  Bla Bla Bla Bla T12345 Bla Bla Bla
31/01/2014 11:15:40 | Bla Bla Bla 2014/03/04 Bla Bla Bla

для вашего ввода.

8
05.01.2019, 14:52
2 ответа

Команда printfиспользует свой первый аргумент в качестве формата для вывода последующих аргументов. printf %100sвыводит свои аргументы, дополненные до 100 символов шириной, используя пробелы (слева ). Для форматирования не предоставляется аргумент, поэтому он форматирует пустую строку один раз и выводит 100 пробелов. Вы можете видеть, что:

$ printf %100s | hexdump -C
00000000  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
00000064

(20 — шестнадцатеричный пробел; *означает повторение предыдущей строки)

В строках формата используются приблизительно спецификаторы C Xprintf:%, необязательная ширина для размещения отформатированного значения,и тип используемого формата. s— это форматирование строки, и строки по умолчанию дополняются пробелами слева. Может быть несколько форматов или других буквальных частей:printf "a%10sb\n" helloотпечатков

 a         xb.

trзаменяет выбранные символы в стандартном вводе выбранными заменами и выводит результат на стандартный вывод. tr " " "="содержит один символ для замены -пробелом -и один символ для замены на -знак равенства. Таким образом, он превращает каждый пробел во входных данных в =, а остальные оставляет без изменений. Вы тоже можете попробовать:

$ tr " " "="
hello world
hello=world

(Я набрал "привет, мир")

У вас может быть несколько замен:tr abc defпревращает a в d, b в e, c в f, а остальное оставляет без изменений. Здесь это всего лишь один символ, так как printfмог дешево сгенерировать именно его.

Конвейер |вызывает вывод команды слева, printf %100s, для использования в качестве ввода команды справа, tr " " "=". То есть в trдается сто последовательных пробелов, и каждый из них заменяется на =, при этом выводится новая строка.

printf %100s | tr " " "="
====================================================================================================
11
27.01.2020, 20:08

Короче говоря, printf %100sнапечатает 100 пробелов, а tr " " "="преобразует эти пробелы в знаки равенства, фактически напечатав 100 знаков равенства.

Разрушение:


printf— это оболочка, встроенная в -. Обычно она принимает два или более аргумента, первый из которых является «строкой формата», а остальные будут использоваться для заполнения заполнителей в этой строке формата. Как только этот шаблон будет полностью заполнен, он распечатает результат. Если осталось больше аргументов, он начнет сначала, заполнив дополнительные аргументы и распечатав результирующую строку.

Строка формата, используемая для printf, принимает спецификации формата, которые начинаются с %и заканчиваются одной буквой, поэтому %dозначает целое число (с использованием десятичной системы счисления, поэтому "d" ), %fозначает число с плавающей запятой -, а %sозначает строку символов. Символы, отличные от букв после %, являются модификаторами спецификации формата, и, в частности, числа используются для указания требуемой длины поля на выходе. Таким образом, %100sотформатирует строку так, чтобы она содержала не менее 100 символов, дополнит ее пробелами и сохранит правильное выравнивание (, другими словами, добавит пробелы в начале строки.)

Если передать дополнительный аргумент, он будет использовать его для этого поля %s, поэтому, например, printf %100s abcбудет печатать 97 пробелов (, чтобы получить общее количество 100, учитывая 3 в "abc" ), за которыми следует фактической строкой "abc". Но если аргумент не указан, то спецификация формата заполняется пустым или нулевым аргументом (, который является пустой строкой для %s, это будет 0 для %dи т. д. )То же самое как если бы была передана пустая строка, например printf %100s ''. Конечным результатом является то, что печатается только заполнение из 100 символов.

Таким образом, если сложить все вместе, printf %100sбудет напечатано 100 пробелов.


Теперь tr— это инструмент для перевода символов из ввода в вывод. Он принимает два аргумента, SET1 и SET2, каждый из которых является набором символов, а затем переводит первый символ SET1 в первый символ SET2, второй символ SET1 во второй символ SET2 и так далее. trсчитывает ввод из стандартного ввода и записывает его обратно в стандартный вывод (, поэтому он очень полезен в конвейерах, подобных приведенному выше.)trвсегда переводит все вхождения этого символа в заданную строку.

Например, tr aeiou 12345будет переводить гласные в нижнем регистре в числа от 1 до 5 в указанном порядке, поэтому слово «queueing» будет переведено, например, в «q52523ng». Вы также можете передать ему диапазоны символов, например tr a-z A-Z, чтобы превратить любую строчную букву в соответствующую прописную.

Таким образом, tr " " "="просто переводит пробелы в знаки равенства по всей строке. Первый пробел должен быть заключен в кавычки, чтобы его можно было распознать как аргумент. =на самом деле не нужно цитировать, но это не повредит. tr " " =сработало бы так же.


Собрав все вместе, выведите 100 пробелов, затем переведите каждый из них в знаки равенства.

Надеюсь, это объясняет это достаточно подробно, но если вы все еще что-то не понимаете, пожалуйста, оставьте комментарий, и я постараюсь решить эту проблему.

14
27.01.2020, 20:08

Теги

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