Слово красивая может храниться в файле размером в байты, кавычки при расчетах не учитываются
Обновлено: 21.11.2024
Python предоставляет встроенные функции и модули для поддержки этих операций.
Открытие/закрытие файла
Чтение/запись текстовых файлов
Объект fileObj, возвращаемый после открытия файла, содержит указатель файла. Первоначально он располагается в начале файла и перемещается вперед всякий раз, когда выполняются операции чтения/записи.
Чтение строки/строк из текстового файла
- fileObj.readline() -> str : (наиболее часто используемый) Читает следующую строку (до и включая новую строку) и возвращает строку (включая новую строку). Он возвращает пустую строку после конца файла (EOF).
- fileObj.readlines() -> [str] : чтение всех строк в список строк.
- fileObj.read() -> str : чтение всего файла в строку.
Запись строки в текстовый файл
- fileObj.write(str) -> int : Записать заданную строку в файл и вернуть количество записанных символов. Вам нужно явно завершить str с помощью '\n' , если это необходимо. '\n' будет преобразован в новую строку в зависимости от платформы ("\r\n" для Windows или '\n' для Unix/Mac OS).
Примеры
Построчная обработка текстового файла
Мы можем использовать оператор with для открытия файла, который будет автоматически закрыт при выходе, и цикл for для построчного чтения следующим образом:
Выражение with эквивалентно выражению try-finally следующим образом:
Пример: построчное копирование файла
Следующий скрипт копирует один файл в другой построчно, добавляя перед каждой строкой номер строки.
Операции с двоичными файлами
- fileObj.tell() -> int : возвращает текущую позицию в потоке. Текущая позиция потока — это количество байтов от начала файла в двоичном режиме и непрозрачное число в текстовом режиме.
- fileObj.seek(смещение): устанавливает текущую позицию в потоке на смещение байт от начала файла.
Например, [ЗАДАЧ]
Каталог и управление файлами
В Python управление каталогами и файлами поддерживается модулями os , os.path , Shutil , .
Операции с путями с использованием модуля os.path
В Python путь может означать:
- файл,
- каталог или
- символическая ссылка (символическая ссылка).
Путь может быть абсолютным (начиная с корня) или относительным относительно текущего рабочего каталога (CWD).
Разделитель пути зависит от платформы (Windows использует '\' , а Unix/Mac OS использует ' /' ). Модуль os.path поддерживает независимые от платформы операции над путями, разумно обрабатывая разделитель путей.
Проверка существования и типа пути
- os.path.exists(path) -> bool : проверить, существует ли указанный путь.
- os.path.isfile(путь_к_файлу) , os.path.isdir(путь_к_каталогу) , os.path.islink(путь_ссылки) -> bool : проверить, является ли указанный путь файлом, каталогом или символической ссылкой.
Формирование нового пути
Разделитель пути зависит от платформы (Windows использует '\' , а Unix/Mac OS использует '/' ). Для переносимости важно НЕ жестко кодировать разделитель пути. Модуль os.path поддерживает независимые от платформы операции над путями, разумно обрабатывая разделитель путей.
- os.path.sep : разделитель путей текущей системы.
- os.path.join(path, *paths) : формирование и возврат пути путем объединения одного или нескольких компонентов пути путем вставки зависящего от платформы разделителя пути ( '/' или '\' ). Чтобы сформировать абсолютный путь, вам нужно начать с os.path.sep от имени пользователя root.
Управление именем каталога и именем файла
- os.path.dirname(путь) : возвращает имя каталога для заданного пути (файл, каталог или символическая ссылка). Возвращаемое имя каталога может быть абсолютным или относительным, в зависимости от заданного пути.
- os.path.abspath(path) : возвращает абсолютный путь (начиная с корня) заданного path . Это может быть абсолютное имя файла, абсолютное имя каталога или абсолютная символическая ссылка.
Например, чтобы сформировать абсолютный путь к файлу с именем out.txt в том же каталоге, что и in.txt , вы можете извлечь абсолютное имя каталога из in.txt , а затем присоединиться к out.txt следующим образом:
Когда модуль загружается в Python, __file__ устанавливается на имя модуля. Попробуйте запустить этот скрипт с различными ссылками на __file__ и изучите их вывод:
Обработка символической ссылки (Unixes/Mac OS)
- os.path.realpath(path) : (для символических ссылок) Аналогично abspath() , но возвращает канонический путь, исключая любые встречающиеся символические ссылки.
Управление каталогами и файлами с помощью модулей os и Shutil
Модули os и Shutil обеспечивают интерфейс к операционной системе и системной оболочке.
- Если вы хотите просто прочитать или записать файл, используйте встроенную функцию open() .
- Если вы просто хотите управлять путями (файлами, каталогами и символическими ссылками), используйте модуль os.path.
- Если вы хотите прочитать все строки во всех файлах в командной строке, используйте модуль ввода файлов.
- Для создания временных файлов/каталогов используйте модуль tempfile.
Управление каталогом
Управление файлами
- os.rename(src_file, dest_file) : переименовать файл.
- os.remove(файл) или os.unlink(файл): удалить файл. Вы можете использовать os.path.isfile(file), чтобы проверить, существует ли file.
Например [TODO],
Список каталогов
- os.listdir(path='.') -> [path] : список всех записей в данном каталоге (исключая '.' и '..' ), по умолчанию текущий каталог.
Рекурсивное отображение каталога с помощью os.walk()
- os.walk(top, topdown=True, onerror=None, followlinks=False): рекурсивно перечислить все записи, начиная с top .
Рекурсивное отображение каталога с помощью модуля glob (Python 3.5)
Копирование файла
Команда оболочки [TODO]
- os.system(command_str) : запустить команду оболочки. (В Python 3 вместо этого используйте subprocess.call().)
Переменные среды [TODO]
- os.getenv(varname, value=None) : возвращает переменную среды, если она существует, или value, если ее нет. , по умолчанию нет .
- os.putenv(имя_переменной, значение) : установите для переменной среды значение значение.
- os.unsetenv(имя_переменной): удалить (сбросить) переменную среды.
модуль ввода файла
Модуль fileinput обеспечивает поддержку обработки строк ввода из одного или нескольких файлов, указанных в аргументах командной строки ( sys.argv ). Например, создайте следующий скрипт с именем " test_fileinput.py ":
Обработка текста
Для простых операций с текстовыми строками, таких как поиск и замена строк, можно использовать встроенные строковые функции (например, str.replace(old, new)) ) . Для поиска и замены сложных шаблонов вам необходимо освоить регулярное выражение (регулярное выражение).
Операции со строками
Встроенный класс str предоставляет множество функций-членов для работы с текстовыми строками. Предположим, что s — это объект str.
Удалить пробелы (пробел, табуляция и новая строка)
- s.strip()-> str : возвращает копию строки s с удаленными начальными и конечными пробелами. Пробелы включают пробел, табуляцию и новую строку.
- s.strip([chars]) -> str : удаляет заданные начальные/конечные символы вместо пробелов.
- s.rstrip() , s.lstrip() -> str : удаляет правые (конечные) пробелы и левые (начальные) пробелы соответственно.< /li>
s.rstrip() чаще всего используется для удаления завершающих пробелов/перевода строки. Ведущие пробелы обычно имеют значение.
Верхний/нижний регистр
- s.upper() , s.lower() -> str : возвращает копию строки s, преобразованную в верхний и нижний регистр. соответственно.
- s.isupper() , s.islower() -> bool : проверьте, является ли строка прописной или строчной, соответственно.
- s.find(key_str, [начало], [конец]) -> int|- 1 : вернуть самый низкий индекс в срезе s [начало:конец] (по умолчанию вся строка); или -1, если не найдено.
- s.index(key_str, [начало], [конец]) -> int|ValueError : аналогично find() , но вызывает ValueError, если не найдено.
- s.startswith(key_str, [начало], [конец]) , s .endsswith(key_str, [начало], [конец]) -> bool : проверить, начинается или заканчивается строка с key_str .
Найти и заменить
- s.replace(old, new, [count]) -> str : вернуть копию при этом все вхождения old заменены на new . Необязательный параметр count ограничивает количество заменяемых вхождений, по умолчанию все вхождения.
str.replace() идеально подходит для простой замены текстовой строки без необходимости сопоставления с образцом.
Разделить на токены и объединить
- s.split([sep], [maxsplit=-1]) -> [str] : возвращает список слов. используя sep в качестве строки-разделителя. Разделителем по умолчанию являются пробелы (пробел, табуляция и новая строка). Параметр maxSplit ограничивает максимальное количество операций разделения, по умолчанию -1 означает отсутствие ограничений.
- sep.join([str]) -> str : обратный метод split() . Присоединяйтесь к списку строк с помощью sep в качестве разделителя.
Регулярное выражение в модуле re
Я предполагаю, что вы знакомы с регулярными выражениями, иначе вы могли бы прочитать:
- "Регулярное выражение на примерах" для обзора синтаксиса регулярных выражений и примеров.
- "Регулярные выражения" для полного охвата.
Модуль re обеспечивает поддержку регулярных выражений (regex).
Обратная косая черта ( \ ), исходная строка Python r'. ' против обычной строки
В синтаксисе регулярного выражения используется обратная косая черта ( \ ):
- для метасимволов, таких как \d (цифра), \D (не цифра), \s (пробел), \S (не пробел), \w (слово), \W (не слово)
- для экранирования специальных символов регулярных выражений, например, \. для . , \+ для + , \* для * , \? для ? . Вам также нужно написать \\ для соответствия \ .
С другой стороны, обычные строки Python также используют обратную косую черту для управляющих последовательностей, например, \n для новой строки, \t для табуляции. Опять же, вам нужно написать \\ вместо \ .
Чтобы записать шаблон регулярного выражения \d+ (одна или несколько цифр) в обычную строку Python, вам нужно написать '\\d+' . Это громоздко и чревато ошибками.
Решение Python использует необработанную строку с префиксом r в форме r'. ' . Он игнорирует интерпретацию управляющей последовательности строки Python. Например, r'\n' — это '\'+'n' (два символа) вместо новой строки (один символ). Используя необработанную строку, вы можете написать r'\d+' для шаблона регулярного выражения \d+ (вместо обычной строки '\\d+' ).
Кроме того, Python обозначает обратные ссылки в скобках (или группы захвата) как \1 , \2 , \3 , . которые могут быть записаны как необработанные строки r'\1' , r'\2' вместо обычных строк '\\1' и '\\2' . Обратите внимание, что в некоторых языках используются $1, $2, . для обратных ссылок.
Я предлагаю вам использовать необработанные строки для строк шаблонов регулярных выражений и строк замены.
Компиляция (создание) объекта шаблона регулярных выражений
Вызов операций регулярных выражений
Вы можете вызывать большинство функций регулярных выражений двумя способами:
- regexObj.func(str): применить скомпилированное регулярное выражение object к str , через функцию-член SRE_Pattern func() .
- re.func(regexObj|regexStr, str) : применить объект регулярного выражения (скомпилированный) или < em>regexStr (не скомпилировано) в str через функцию уровня модуля re func() . Эти функции уровня модуля представляют собой ярлыки для описанных выше, которые не требуют предварительной компиляции объекта регулярного выражения, но пропускают модификаторы, если используется regexStr.
Найти с помощью finalAll()
- regexObj.findall(str) -> [str] : возвращает список всех совпадающих подстрок.
- re.findall(regexObj|regexStr, str) -> [str] : то же, что и выше.
Заменить с помощью sub() и subn()
- regexObj.sub(replaceStr, inStr, [count=0]) -> outStr: заменить (заменить) совпавшие подстроки в заданном inStr на replaceStr , до количества вхождений, по умолчанию все.
- regexObj.subn(replaceStr, inStr, [count=0]) -> (outStr, count) : аналогично sub() , но возвращает новую строку вместе с количеством замен в двух кортежах.
- re.sub(regexObj|regexStr, replaceStr, inStr, [count em>=0]) ->outStr: то же, что и выше.
- re.subn(regexObj|regexStr, replaceStr, inStr, [count em>=0]) -> (outStr, count) : то же, что и выше.
Примечания. Для простой замены строки используйте str.replace(old, new, [max= -1]) -> str, что более эффективно. См. раздел выше.
Использование обратных ссылок в скобках \1 , \2 , . в замене и шаблоне
В Python обратные ссылки в круглых скобках регулярных выражений (группы захвата) обозначаются как \1 , \2 , . Вы можете использовать необработанную строку (например, r'\1' ), чтобы избежать экранирования обратной косой черты в обычной строке (например, '\\1' ).
Найти с помощью search() и Match Object
Поиск() возвращает специальный объект Match, инкапсулирующий первое совпадение (или None, если совпадений нет). Затем вы можете использовать следующие методы для обработки результирующего объекта Match:
- matchObj.group() : возвращает совпадающую подстроку.
- matchObj. start() : возвращает начальную совпадающую позицию (включительно).
- matchObj. end() : возвращает конечную совпавшую позицию (эксклюзивно).
- matchObj. span() : возвращает кортеж совпадающей позиции (начало, конец).
Чтобы получить обратные ссылки (или группы захвата) внутри объекта Match:
- matchObj. groups() : возвращает кортеж захваченных групп (или обратных ссылок)
- matchObj .group(n) : возвращает захватываемую группу n , где n начинается с 1 .
- matchObj.lastindex : последний индекс захватываемой группы
Поиск с использованием match() и fullmatch()
Search() соответствует любому заданному элементу inStr[begin:end] . С другой стороны, match() соответствует с начала inStr[начало:конец] (аналогично в шаблон регулярного выражения ^. ); в то время как fullmatch() соответствует всему inStr[begin:end] (аналогично шаблону регулярного выражения ^. $ ).
Найти с помощью finditer()
Функция finditer() аналогична функции findall(). findall() возвращает список совпадающих подстрок. Finditer() возвращает итератор для объектов Match. Например,
Разделение строки на токены
Функция split() разбивает заданный inStr на список, используя шаблон регулярного выражения в качестве разделителя (разделителя). Например,
Примечания. Для простого разделителя используйте str.split([sep]) , что более эффективно. См. раздел выше.
Парсинг веб-страниц
Ссылки:
Очистка веб-страниц (или сбор веб-страниц или извлечение веб-данных) – это чтение необработанной HTML-страницы для извлечения нужных данных. Излишне говорить, что вам необходимо освоить HTML, CSS и JavaScript.
Python поддерживает просмотр веб-страниц с помощью запросов пакетов и BeautifulSoup (bs4).
Установить пакеты
Вы можете установить соответствующие пакеты с помощью pip следующим образом:
Шаг 0. Проверка целевой веб-страницы
- Нажмите F12 на целевой веб-странице, чтобы включить отладчик F12.
- Выберите «Инспектор».
- Нажмите кнопку "Выбрать" (крайний левый значок со стрелкой) и наведите указатель мыши на нужную часть HTML-страницы. Изучите коды.
Шаг 2. Преобразование HTML-текста в древовидную структуру с помощью BeautifulSoup и поиск нужных данных
Вы можете записать выбранные данные в файл:
Вы также можете использовать модуль csv для записи строк данных с заголовком:
Шаг 3. Загрузите выбранный документ с помощью urllib.request
Возможно, вы захотите загрузить такие документы, как текстовые файлы или изображения.
Шаг 4. Задержка
Чтобы избежать рассылки спама на веб-сайт с запросами на загрузку (и пометки как спамера), вам необходимо на некоторое время приостановить работу кода.
Утилита сортировки файлов, часто используемая в качестве фильтра в конвейере. Эта команда сортирует текстовый поток или файл вперед или назад или в соответствии с различными клавишами или позициями символов. Используя параметр -m, он объединяет предварительно отсортированные входные файлы. На информационной странице перечислены его многочисленные возможности и параметры. См. пример 11-10, пример 11-11 и пример A-8.
Топологическая сортировка, чтение пар строк, разделенных пробелами, и сортировка в соответствии с входными шаблонами. Первоначальной целью tsort была сортировка списка зависимостей для устаревшей версии компоновщика ld в «древней» версии UNIX.
Результаты tsort обычно заметно отличаются от результатов стандартной команды sort, описанной выше.
Этот фильтр удаляет повторяющиеся строки из отсортированного файла. Его часто можно увидеть в конвейере в сочетании с sort .
Полезная опция -c ставит перед каждой строкой входного файла ее количество вхождений.
bash$ cat testfile Эта строка встречается только один раз. Эта строка встречается дважды. Эта строка встречается дважды. Эта строка встречается три раза. Эта строка встречается три раза. Эта строка встречается три раза. bash$ uniq -c testfile 1 Эта строка встречается только один раз. 2 Эта строка встречается дважды. 3 Эта строка встречается три раза. bash$ сортировать тестовый файл | уникальный -c | sort -nr 3 Эта строка встречается три раза. 2 Эта строка встречается дважды. 1 Эта строка встречается только один раз.
Сортировка INPUTFILE | уникальный -c | Командная строка sort -nr создает список частот появления в файле INPUTFILE (параметры -nr для sort вызывают обратную числовую сортировку). Этот шаблон находит применение при анализе файлов журналов и списков словарей, а также везде, где необходимо изучить лексическую структуру документа.
Пример 16-12. Частотный анализ слов
bash$ cat testfile Эта строка встречается только один раз. Эта строка встречается дважды. Эта строка встречается дважды. Эта строка встречается три раза. Эта строка встречается три раза. Эта строка встречается три раза. bash$ ./wf.sh тестовый файл 6 это 6 встречается 6 строка 3 раза 3 три 2 дважды 1 только 1 один раз
Фильтр расширения преобразует табуляцию в пробелы. Он часто используется в пайпе .
Неразвернутый фильтр преобразует пробелы во вкладки. Это отменяет эффект расширения .
Использование cut для получения списка смонтированных файловых систем:
вырезать -d ' ' -f1,2 /etc/mtab
имя -a | вырезать -d" " -f1,3,11,12
Использование cut для извлечения заголовков сообщений из папки электронной почты:
cut -d ' ' -f2,3 имя файла эквивалентно awk -F'[ ]' '< print $2, $3 >' имя файла
В качестве разделителя можно даже указать перевод строки. Хитрость заключается в том, чтобы фактически встроить перевод строки ( RETURN ) в последовательность команд.
bash$ cut -d' ' -f3,7,19 testfile Это строка 3 тестового файла. Это строка 7 тестового файла. Это строка 19 тестового файла.
Спасибо, Яка Кранич, за указание на это.
Инструмент для объединения разных файлов в один файл с несколькими столбцами. В сочетании с cut полезно для создания файлов системного журнала.
bash$ предметы для кошек алфавитные блоки строительные блоки кабели bash$ цены для кошек 1,00 долл. США за дюжину 2,50 долл. США за штуку. $3,75 bash$ Цены на вставки блоков с алфавитом $1,00/дюжина строительных блоков $2,50 за штуку. кабели 3,75 долл. США
Считайте, что это родственница пасты специального назначения . Эта мощная утилита позволяет осмысленно объединять два файла, что по существу создает простую версию реляционной базы данных.
Файл: 1.data 100 туфель, 200 шнурков, 300 носков
Файл: 2.data 100 40,00 $ 200 1,00 $ 300 2,00 $
bash$ join 1.data 2.data File: 1.data 2.data 100 туфель 40 долларов США 200 шнурков 1 доллара США 300 носков 2 доллара США
Поле с тегом появляется в выходных данных только один раз.
выводит начало файла на стандартный вывод. По умолчанию 10 строк, но можно указать другое количество. Команда имеет ряд интересных опций.
Пример 16-13. Какие файлы являются скриптами?
Пример 16-14. Генерация 10-значных случайных чисел
выводит (хвост) конец файла на стандартный вывод. По умолчанию это 10 строк, но это можно изменить с помощью опции -n. Обычно используется для отслеживания изменений в файле системного журнала с использованием параметра -f, который выводит строки, добавленные к файлу.
Пример 16-15. Использование tail для мониторинга системного журнала
Чтобы установить переменную в данный блок текстового файла:
В более новых реализациях tail старое использование имени файла tail -$LINES не рекомендуется. Стандартное имя файла tail -n $LINES верно.
шаблон grep [ файл . ]
Поиск в целевом файле (файлах) вхождения шаблона , где шаблон может быть буквальным текстом или регулярным выражением.
bash$ grep '[rst]ystem.$' osinfo.txt Лицензия GPL регулирует распространение операционной системы Linux.
Если целевые файлы не указаны, grep работает как фильтр для stdout , как в канале .
bash$ ps топор | часы grep 765 tty1 S 0:00 xclock 901 pts/1 S 0:00 часы grep
Опция -i приводит к поиску без учета регистра.
Опция -w соответствует только целым словам.
Опция -l показывает только те файлы, в которых были найдены совпадения, но не совпадающие строки.
Опция -r (рекурсивная) ищет файлы в текущем рабочем каталоге и во всех подкаталогах ниже него.
Опция -n выводит список совпадающих строк вместе с номерами строк.
bash$ grep -n Linux osinfo.txt 2: Это файл, содержащий информацию о Linux. 6: GPL регулирует распространение операционной системы Linux.
Опция -c ( --count ) дает числовое количество совпадений, а не их список.
Опция --color (или --color ) помечает совпадающую строку цветом (на консоли или в окне xterm). Так как grep выводит всю строку, содержащую шаблон соответствия, это позволяет вам точно увидеть, что сопоставляется. См. также параметр -o, который показывает только совпадающую часть строки (строк).
Пример 16-16. Распечатка строк From в сохраненных сообщениях электронной почты
При вызове с более чем одним заданным целевым файлом grep указывает, какой файл содержит совпадения.
bash$ grep Linux osinfo.txt misc.txt osinfo.txt:Это файл, содержащий информацию о Linux. osinfo.txt: GPL регулирует распространение операционной системы Linux. misc.txt:Операционная система Linux неуклонно набирает популярность.
Чтобы заставить grep отображать имя файла при поиске только одного целевого файла, просто укажите /dev/null в качестве второго файла.
bash$ grep Linux osinfo.txt /dev/null osinfo.txt:Это файл, содержащий информацию о Linux. osinfo.txt: GPL регулирует распространение операционной системы Linux.
Пример 16-17. Эмуляция grep в скрипте
Как grep может искать два (или более) отдельных шаблона? Что делать, если вы хотите, чтобы grep отображал все строки в файле или файлах, содержащих как «шаблон1», так и «шаблон2»?
Например, для следующего файла:
Теперь давайте найдем в этом файле строки, содержащие как «файл», так и «текст». . .
Теперь интересное использование grep для развлечения. . .
Пример 16-18. Решение кроссвордов
bash $ egrep 'matches|Matches' file.txt Строка 1 соответствует. Линия 3 соответствует. Строка 4 содержит совпадения, а также совпадения
В некоторых дистрибутивах Linux egrep и fgrep являются символическими ссылками или псевдонимами для grep , но вызываются с параметрами -E и -F соответственно.
Пример 16-19. Поиск определений в Словаре Вебстера 1913 года
agrep ( приблизительное соответствие grep ) расширяет возможности grep до приблизительного соответствия. Строка поиска может отличаться от полученных совпадений на заданное количество символов. Эта утилита не является частью основного дистрибутива Linux.
Для поиска сжатых файлов используйте zgrep , zegrep или zfgrep . Они также работают с несжатыми файлами, хотя и медленнее, чем обычные grep, egrep, fgrep. Они удобны для поиска в смешанном наборе файлов, некоторые из которых сжаты, а некоторые нет.
Команда look работает так же, как grep , но выполняет поиск в "словаре", отсортированном списке слов. По умолчанию поиск ищет совпадения в /usr/dict/words , но может быть указан другой файл словаря.
Пример 16-20. Проверка слов в списке на достоверность
Языки сценариев, особенно подходящие для анализа текстовых файлов и вывода команд. Могут быть встроены по отдельности или в комбинации в конвейеры и сценарии оболочки.
Неинтерактивный «редактор потока», позволяющий использовать многие ex-команды в пакетном режиме. Он находит множество применений в сценариях оболочки.
Программируемое средство извлечения и форматирования файлов, подходящее для манипулирования и/или извлечения полей (столбцов) в структурированных текстовых файлах. Его синтаксис похож на C.
bash $ wc /usr/share/doc/sed-4.1.2/README 13 70 447 README [13 строк 70 слов 447 символов]
wc -w дает только количество слов.
wc -l дает только количество строк.
wc -c дает только количество байтов.
wc -m дает только количество символов.
wc -L дает только длину самой длинной строки.
Использование wc для подсчета количества файлов .txt в текущем рабочем каталоге:
Использование команды wc для суммирования размера всех файлов, имена которых начинаются с букв в диапазоне от d до h
bash$ wc [d-h]* | общее количество | авк '' 71832
Использование wc для подсчета слов "Linux" в основном исходном файле этой книги.
bash$ grep Linux abs-book.sgml | туалет -l 138
Некоторые команды включают некоторые функции wc в виде опций.
фильтр перевода символов.
Либо tr "A-Z" "*", либо tr A-Z \* изменяет все прописные буквы в имени файла на звездочки (записывает в stdout ). В некоторых системах это может не работать, но tr A-Z '[**]' сработает.
Опция --squeeze-repeats (или -s ) удаляет все, кроме первого экземпляра строки последовательных символов. Эта опция полезна для удаления лишних пробелов.
bash$ эхо "XXXXX" | tr --squeeze-repeats 'X' X
Опция -c "дополнение" инвертирует набор символов для соответствия. С этой опцией tr действует только на те символы, которые не соответствуют указанному набору.
bash$ echo "acfdeb123" | tr -c b-d + +c+d+b++++
bash$ echo "abcd2ef1" | tr '[:alpha:]' - ----2--1
Пример 16-21. toupper : преобразует файл в верхний регистр.
Пример 16-22. нижний регистр : изменяет все имена файлов в рабочем каталоге на нижний регистр.
Пример 16-23. du : Преобразование текстовых файлов DOS в UNIX.
Пример 16-24. rot13 : сверхслабое шифрование.
Пример 16-25. Генерация головоломок «Крипто-цитата»
У утилиты tr есть два исторических варианта. Версия BSD не использует скобки ( tr a-z A-Z ), а версия SysV использует ( tr '[a-z]' '[A-Z]' ). Версия tr GNU похожа на версию BSD.
Фильтр, который переносит строки ввода до заданной ширины. Это особенно полезно с параметром -s, который разрывает строки по пробелам слов (см. пример 16-26 и пример A-1).
Простое средство форматирования файлов, используемое в качестве фильтра в канале для "переноса" длинных строк вывода текста.
Пример 16–26. Отформатированный список файлов.
Этот фильтр с обманчивым названием удаляет обратные переводы строки из входного потока. Он также пытается заменить пробел эквивалентными вкладками. В основном col используется для фильтрации вывода некоторых утилит обработки текста, таких как groff и tbl .
Формат столбца. Этот фильтр преобразует текстовый вывод в виде списка в «красивую» таблицу, вставляя вкладки в соответствующих местах.
Пример 16-27. Использование столбца для форматирования списка каталогов
Фильтр удаления столбцов. Это удаляет столбцы (символы) из файла и записывает файл, в котором отсутствует диапазон указанных столбцов, обратно в stdout . colrm 2 4 удаляет символы со второго по четвертый из каждой строки имени файла текстового файла.
Если файл содержит табуляцию или непечатаемые символы, это может привести к непредсказуемому поведению. В таких случаях рассмотрите возможность использования expand и unexpand в канале, предшествующем colrm .
Фильтр нумерации строк: nl имя файла выводит имя файла на стандартный вывод, но вставляет последовательные числа в начале каждой непустой строки. Если имя файла не указано, работает со стандартным вводом.
Вывод nl очень похож на cat -b , поскольку по умолчанию nl не отображает пустые строки.
Пример 16-28. nl : скрипт с самонумерацией.
Фильтр форматирования печати. Это разбивает файлы (или stdout ) на разделы, подходящие для печати или просмотра на экране. Различные параметры позволяют манипулировать строками и столбцами, соединять строки, устанавливать поля, нумеровать строки, добавлять заголовки страниц и объединять файлы, среди прочего. Команда pr сочетает в себе большую часть функций nl, вставки, сворачивания, столбца и расширения.
pr -o 5 --width=65 fileZZZ | more выводит на экран хороший список файлов ZZZ с разбивкой на страницы с полями, установленными на 5 и 65.
Особенно полезная опция -d , заставляющая использовать двойной интервал (тот же эффект, что и sed -G ).
Программа gettext работает со сценариями оболочки. См. информационную страницу .
Программа для создания двоичных каталогов сообщений. Он используется для локализации .
Утилита для преобразования файлов в другую кодировку (набор символов). В основном он используется для локализации.
Считайте это более сложной версией iconv, приведенной выше. Это очень универсальная утилита для преобразования файла в другую схему кодирования. Обратите внимание, что recode не является частью стандартной установки Linux.
TeX и Postscript — это языки разметки текста, используемые для подготовки копии к печати или форматированного отображения видео.
TeX – это разработанная Дональдом Кнутом сложная система набора текста. Часто удобно написать сценарий оболочки, инкапсулирующий все параметры и аргументы, передаваемые одному из этих языков разметки.
Ghostscript ( gs ) – это интерпретатор Postscript под лицензией GPL.
Утилита для обработки файлов TeX и pdf. Найденный в /usr/bin во многих дистрибутивах Linux, он на самом деле представляет собой оболочку оболочки, которая вызывает Perl для вызова Tex.
Утилита для преобразования обычного текстового файла в формат PostScript
Например, enscript имя_файла.txt -p имя_файла.ps создает выходной файл PostScript имя_файла.ps .
Еще один язык разметки текста и форматирования отображения — groff . Это расширенная версия GNU почтенного UNIX-пакета отображения и набора текста roff/troff. Man-страницы используют groff .
Утилита обработки таблиц tbl считается частью groff , поскольку ее функция заключается в преобразовании разметки таблицы в команды groff.
Утилита обработки уравнений eqn также является частью groff , и ее функция заключается в преобразовании разметки уравнения в команды groff.
Пример 16-29. manview : просмотр отформатированных справочных страниц
Лексический анализатор lex создает программы для сопоставления с образцом. В системах Linux он был заменен непатентованным flex.
Утилита yacc создает анализатор на основе набора спецификаций. Он был заменен непатентованным bison в системах Linux.
ПримечанияЭто относится только к GNU-версии tr , а не к универсальной версии, часто используемой в коммерческих системах UNIX.
Использование кавычек , также называемых кавычками , немного осложняется тем фактом, что существует два типа кавычек: одинарные (` ' ) и двойные кавычки (" " ). Как правило, британское использование в прошлом обычно предпочитало одинарные кавычки для обычного использования, но теперь все чаще встречаются двойные кавычки; Американское использование всегда предпочитало двойные кавычки. Как мы увидим ниже, использование двойных кавычек на самом деле дает несколько преимуществ, и именно это использование я рекомендую здесь.
Главное использование кавычек довольно легко понять: пара кавычек заключает прямую цитату, то есть повторение чьих-то точных слов. Вот несколько примеров: президент Кеннеди воскликнул: «Ich bin ein Berliner!» Мадонна любит заявлять: «Я ничего не стыжусь». «Единственный император, — пишет Уоллес Стивенс, — это император мороженого».
Внимательно посмотрите на эти примеры. Прежде всего обратите внимание, что в кавычках должны быть точные слова цитируемого лица. Все, что не является частью этих точных слов, должно быть помещено вне кавычек, даже если, как в последнем примере, это означает использование двух наборов кавычек, поскольку цитирование было прервано.
Следовательно, следующий пример неверен : *Томас Эдисон заявил, что «Гений — это один процент вдохновения и девяносто девять процентов пота».
Здесь отрывок внутри кавычек явно не воспроизводит точные слова Эдисона. Есть три способа это исправить. Во-первых, опустим кавычки: Томас Эдисон заявил, что гений состоит из одного процента вдохновения и девяноста девяти процентов пота.
Во-вторых, перепишите предложение так, чтобы можно было использовать точные слова Эдисона: По словам Томаса Эдисона, "Гений — это один процент вдохновения и девяносто девять процентов пота".
В-третьих, переместите кавычки так, чтобы они содержали только точные слова Эдисона: Томас Эдисон заявил, что гений — это «один процент вдохновения и девяносто девять процентов пота».
Все три из них идеальны, так как только точные слова Эдисона заключены в кавычки.
Теперь обратите внимание на еще одну очень важную вещь: цитата выделяется кавычками и ничем другим. Предложение, содержащее цитату, ставится точно так же, как и любое другое предложение, за исключением добавления кавычек. Вы не должны вставлять в предложение дополнительные знаки препинания только для того, чтобы предупредить читателя о цитате: для этого и нужны кавычки.Следовательно, первые два из следующего являются дурным тоном, а третий — неправильным: *Президент Никсон заявил: «Я не мошенник». *Президент Никсон заявил: «Я не мошенник». *Президент Никсон заявил: «Я не мошенник».
Запятая и двоеточие в первых двух совершенно бессмысленны, а поразительный арсенал знаков препинания в третьем выглядит гротескно. (Помните, за двоеточием никогда не может следовать дефис или тире.) Вот предложение с правильной пунктуацией: Президент Никсон заявил: «Я не мошенник».
Добавление точек и закорючек к этому совершенно четкому предложению абсолютно не улучшит его. Знаки препинания не должны использоваться, если в этом нет необходимости.
С другой стороны, наличие кавычек не отменяет необходимости использования других знаков препинания, которые требуются по независимым причинам. Посмотрите еще раз на эти примеры: По словам Томаса Эдисона, «Гений — это один процент вдохновения и девяносто девять процентов пота». «Единственный император, — пишет Уоллес Стивенс, — это император мороженого».
Запятые здесь заключают в скобки запятые, используемые, как обычно, для выделения слабых прерываний; их присутствие не имеет ничего общего с наличием цитаты, которая сама по себе должным образом заключена в кавычки.
Вот еще один пример: у Мэй Уэст было одно золотое правило обращения с мужчинами: "Говорить красивым, что они умные, и говорить умным, что они симпатичные".
Здесь двоеточие используется не только потому, что за ним следует цитата. Вместо этого он делает то, что всегда делают двоеточия: вводит объяснение того, что стоит перед двоеточием. Это просто совпадение, что то, что следует за двоеточием, является цитатой.
Последний пример иллюстрирует еще один момент, касающийся цитат: цитата внутри кавычек начинается с заглавной буквы, если это полное предложение, но не в противном случае. Посмотрите еще раз на две версии фразы Эдисона: Согласно Томасу Эдисону, «Гений — это один процент вдохновения и девяносто девять процентов пота». Томас Эдисон заявил, что гений — это «один процент вдохновения и девяносто девять процентов пота».
Первая цитата представляет собой законченное предложение и поэтому пишется с заглавной буквы; второе не является полным предложением и, следовательно, не получает заглавной буквы.
Есть одна ситуация, в которой использование одинарных кавычек вместо двойных может доставлять неудобства. Это когда цитата содержит апостроф, особенно ближе к концу: Сталин вызывающе заявил: «Гитлеровское вторжение в Россию будет не более успешным, чем вторжение Наполеона».
Поскольку апостроф обычно неотличим от закрывающей кавычки, читатель может на мгновение ошибиться, думая, что он дошел до конца цитаты, хотя на самом деле это не так. Это одна из причин, по которой лично я предпочитаю использовать двойные кавычки: Сталин вызывающе заявил, что «вторжение Гитлера в Россию будет не более успешным, чем вторжение Наполеона».
С двойными кавычками проблема исчезает.
Все может немного усложниться, если вы цитируете цитату, внутри которой есть другая цитата. В этом редком случае правило состоит в том, чтобы выделить внутреннюю кавычку другим типом кавычек. Итак, если вы используете двойные кавычки: теневой министр занятости заявил: «Описание показателей безработицы как «разочаровывающих» является оскорблением для британского народа».
И если вы используете одинарные кавычки: теневой министр занятости заявил: «Описание показателей безработицы как «разочаровывающих» является оскорблением для британского народа».
Естественно, вы спросите, что делать, если у вас есть цитата внутри цитаты внутри цитаты. Мой ответ: вам следует переписать предложение. В противном случае вы просто потеряете читателя в лабиринте кавычек.
Если у вас есть длинная цитата, которую вы хотите отобразить с отступом посередине страницы, вам не нужно заключать ее в кавычки, хотя вы должны убедиться, что вы четко идентифицируете ее как цитату в своем основном тексте. Вот пример, процитированный из знаменитой книги Г. В. Кэри о пунктуации «Помните об остановке» (Carey 1958): «Я должен определить пунктуацию как управляемую на две трети правилом и на одну треть личным вкусом. Я постараюсь не подчеркивать первое, исключая второе, но я не буду подчиняться тем, кто, по-видимому, требует для себя полной свободы делать в этом вопросе все, что им заблагорассудится.
Было бы неправильно заключить этот отрывок в кавычки, но в этом нет необходимости, так как я четко обозначил его как цитату, что обычно и делают кавычки. Не следует использовать знаки препинания, если они не работают.
Иногда вам может понадобиться прервать цитату, которую вы цитируете, чтобы что-то прояснить. Для этого вы заключаете свои замечания в квадратные скобки (ни в коем случае не скобки).Предположим, я хочу процитировать знаменитый отрывок французского писателя XVIII века Алексиса де Токвиля: «Кажется, эти две нации [Америка и Россия] вершат судьбы половины земного шара».
Отрывок, из которого взято это предложение, ранее ясно дал понять, о каких двух нациях говорил автор. Моя цитата, однако, не делает этого ясным, поэтому я вставил необходимую информацию, заключенную в квадратные скобки.
Некоторые авторы при этом имеют обыкновение вставлять свои инициалы в квадратные скобки, перед которыми ставится тире. Таким образом, мой пример мог бы выглядеть так: эти две нации [Америка и Россия — РЛТ], кажется, готовы вершить судьбы половины земного шара.
В этом нет ничего плохого, но вряд ли это когда-либо необходимо, так как квадратные скобки уже дают понять, что происходит.
Существует одно специальное прерывание, с которым вы должны быть знакомы. Это происходит, когда отрывок, который вы цитируете, содержит какую-либо ошибку, и вы хотите, чтобы ваш читатель понял, что ошибка содержится в исходном отрывке, а не была введена вами. Для этого вы используете латинское слово sic, означающее «таким образом», снова заключенное в квадратные скобки и сразу же после ошибки. Ошибка может быть любого рода: орфографическая ошибка, грамматическая ошибка, использование неправильного слова или даже явно неверное или глупое утверждение. Вот несколько примеров, все из которых должны быть прямыми цитатами: Мы не получили [ sic ] ваше письмо. Студентов [ sic ] больше, чем обычно. All Blacks выиграли матч благодаря удачной [ sic ] попытке на последней минуте. Последние динозавры вымерли около 60 000 лет назад [ sic ].
(Слово получено с ошибкой; форма are использовалась там, где это требуется; слово fortuitous , означающее «случайный», было использовано там, где имелось в виду удача; последнее утверждение гротескно ложно.) Обратите внимание, что слово sic обычно выделяется курсивом, если курсив доступен. Также обратите внимание, что sic используется не только для выделения части цитаты: он используется только для привлечения внимания к ошибке.
Если вы хотите выделить часть цитаты, вы делаете это, выделяя эту часть курсивом, но вы должны показать, что делаете это. Вот предложение, процитированное из книги Стивена Пинкера «Языковой инстинкт»: «Многие предписывающие правила грамматики просто глупы и должны быть удалены из руководств по использованию [выделено нами].
Здесь мой комментарий в квадратных скобках показывает, что курсива не было в оригинале, но я добавил его, чтобы привлечь внимание к этой части цитаты. Мы рассмотрим использование курсива дальше.
Если вы хотите процитировать части отрывка, опустив некоторые промежуточные фрагменты, вы делаете это, вставляя приостановку ( . ), чтобы обозначить отсутствующую часть цитаты. Если в результате вам нужно указать одно или два дополнительных слова, чтобы связать части цитаты, вы заключаете эти дополнительные слова в квадратные скобки, чтобы показать, что они не являются частью цитаты. Если вам нужно заменить строчную букву на заглавную, вы заключаете эту заглавную в квадратные скобки. Вот пример, взятый из моей книги «Язык: основы» (Trask, 1995): Челси родилась почти глухой, но. ей ошибочно поставили диагноз «умственно отсталый», когда она не научилась говорить. [S] он вырос в любящей семье. [но] только когда ей был тридцать один год, неверующий врач. прописать ей слуховой аппарат. Наконец-то она смогла слышать речь и начала учить английский.
Обратите внимание, что после слова "говорить" во второй строке стоят четыре точки. Причина этого в том, что приостановка следует за полной остановкой. В этом случае британское использование обычно предпочитает писать четыре точки, в то время как американское использование обычно предпочитает писать только три. Вы вольны выбирать, но, как всегда, будьте последовательны.
Естественно, когда вы используете приостановку, будьте осторожны, чтобы не исказить смысл исходного отрывка.
Наконец, остается проблема, ставить ли другие знаки препинания внутри или вне кавычек. Есть две точки зрения на этот счет, которые я буду называть логическим взглядом и традиционным взглядом.
С точки зрения логики внутри кавычек должны быть размещены только те знаки препинания, которые составляют часть кавычки, а все остальные должны быть помещены вне кавычек. Традиционная точка зрения, напротив, настаивает на размещении большинства других знаков препинания внутри закрывающей кавычки, независимо от того, являются ли они частью цитаты. Вот два предложения, расставленные в соответствии с логической точкой зрения: «Единственное, чего нам следует бояться, — сказал Франклин Рузвельт, — это самого страха». Премьер-министр осудил то, что он назвал «простодушными решениями».
И здесь они расставлены в соответствии с общепринятым мнением: «Единственное, чего нам следует бояться, — сказал Франклин Рузвельт, — это самого страха.Премьер-министр осудил то, что он назвал «простодушными решениями».
Обратите внимание на запятую после страха в первом примере и на последнюю точку во втором. Они не являются частью их цитат, поэтому логическая точка зрения помещает их за пределы кавычек, а традиционная точка зрения помещает их внутрь, исходя из теории, что закрывающая кавычка всегда должна следовать за другим знаком препинания.
Какое представление следует предпочесть? Я определенно предпочитаю логическую точку зрения, и в идеальном мире я бы просто посоветовал вам придерживаться этой точки зрения. Однако фактом является то, что очень многие люди усвоили общепринятую точку зрения и строго придерживаются ее. Многие из этих людей занимают влиятельные должности — например, немало из них — редакторы-копирайтеры в крупных издательствах. Следовательно, если вы попытаетесь придерживаться логического взгляда, вы, вероятно, столкнетесь с большим сопротивлением. Лингвист Джефф Пуллум, ярый сторонник логической точки зрения, однажды так разозлился на редакторов, которые настаивали на перетасовке его тщательно расставленных знаков препинания, что написал статью под названием «Пунктуация и человеческая свобода» (Pullum 1984). Вот один из его примеров, сначала с логической пунктуацией: в пьесе Шекспира «Ричард III» есть строчка «Сейчас зима нашего недовольства».
Это правда. А теперь попробуйте расставить обычные знаки препинания: в пьесе Шекспира "Ричард III" есть строчка "Сейчас зима нашего недовольства".
Это строго неверно, поскольку рассматриваемая строка является лишь первой из двух строк, составляющих полное предложение, и, следовательно, не заканчивается точкой, как, очевидно, предполагает общепринятая пунктуация: Сейчас зима нашего недовольство Сделано великолепным летом этим солнцем Йорка.
То же самое возникает и в примере с генералом Седжвиком: последними словами генерала Седжвика своему встревоженному штабу были: «Не волнуйтесь, мальчики, они не могут ударить слона на таком расстоянии—».
Здесь постановка точки внутри закрывающих кавычек, как того требуют конвенционалисты, приведет к идиотскому результату, поскольку весь смысл цитаты в том, что оплакиваемый генерал не дожил до ее завершения. р>
Вы можете следовать своим собственным предпочтениям в этом вопросе, если вы последовательны. Если вы выберете логическую пунктуацию, вам будет приятно узнать, что вы на стороне ангелов, но вы также должны ожидать жесткого сопротивления с другой стороны.
Читайте также: