Я запутался в этой bash строке скрипта - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь преобразовать сценарий bash в python для стажера проекта; в основном скрипт анализирует таблицу и печатает информацию в виде HTML документа.

Эта строка сбивает меня с толку. TMP - это временный документ, который представляет собой вывод lsload, который выводит таблицу, содержащую информацию о хосте сервера.

# Force header text to lowercase
tr '[:upper:]' '[:lower:]' <${TMP} |head --lines=+1 |sed -e 's/[ \t]\+/ /g' >${H_TMP}

Хорошо, первая команда tr преобразует текст заголовка из прописных в строчные , Я не совсем уверен, что делает команда head. И я не совсем понимаю, что делает sed. Кто-нибудь может прояснить, что происходит в этой строке?

В качестве бонуса у кого-нибудь есть идеи относительно того, как я могу преобразовать это в Python?

РЕДАКТИРОВАТЬ : Хорошо, я, кажется, понимаю, что делает sed; он конвертирует любое количество пробелов или табуляций в один пробел. Просто запутался насчет head сейчас.

1 Ответ

2 голосов
/ 07 января 2020

Вы можете легко найти документацию для любой команды Unix, выполнив поиск по ее справочной странице.

http://man7.org/linux/man-pages/man1/head.1.html

Любое основание c Введение в командную строку Unix также покажет, что head читает первые n строк текстового файла, а tail соответственно читает последние n строк текстовый файл.

Весь фрагмент соответствует

with open(os.environ['TMP']) as inputfile, open(os.environ['H_TMP'], 'w') as outputfile:
    for line in inputfile:
        # sed 's/[ \t]+/ /g' is re.sub(...)
        # tr ... is lower()
        line = re.sub(r'\s+', ' ' , line).lower()
        outputfile.write(line)
        # head --lines=1 -- quit after a single line
        break

Выходное выражение регулярного выражения \s соответствует множеству различных пробельных символов; если ваш ввод просто ASCII, он будет перекрываться с простым классом символов [ \t]. Мы можем только догадываться, требуется ли вам, чтобы это совпадало строго с этими двумя символами, если вы действительно хотите обрабатывать Unicode.

Для максимальной компактности вы можете уменьшить это значение до

with open(os.environ['TMP']) as inputfile, open(os.environ['H_TMP'], 'w') as outputfile:
    outputfile.write(re.sub(r'\s+', ' ' , inputfile.readline()).lower())

Если вы хотите чтобы прочитать фиксированное количество строк, где это число не равно 1, возможно, посмотрите на enumerate():

with open(os.environ['TMP']) as inputfile, open(os.environ['H_TMP'], 'w') as outputfile:
    for lineno, line in enumerate(inputfile, 1):
        line = re.sub(r'\s+', ' ' , line).lower()
        outputfile.write(line)
        if lineno == 234:
            break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...