Обратный порядок файла с помощью инструментов POSIX?

  1. Ожидает закрытия } . Вы вошли в список с одной командой, date} и новой строкой, поэтому вы все еще находитесь внутри группы команд и можете либо добавить другую команду в список, либо завершить его.

    Таким образом, он не ждет стандартного ввода (точно), он ждет, пока вы завершите команду, которую вы запустили в первой строке. Если вы введете здесь } , вы (вероятно) получите сообщение об ошибке от команды date о том, что она не понимает "} ".

  2. { и } - допустимые аргументы для общих команд, как показано в пункте 1. Например, find использует {} в качестве аргумента. .

    В частности, только слова « {» и «} » являются зарезервированными словами . Зарезервированные слова в оболочке имеют значение только тогда, когда они даны как отдельное слово целиком и только там, где они конкретно ожидаются. Наиболее важное место, где они ожидаются, - это начало команды.

    Точка с запятой или новая строка означает, что } появляется в начале следующей команды в списке, где его можно распознать как зарезервированное слово с учетом его особой обработки.Это указано в POSIX для грамматики оболочки :

    Это правило также подразумевает, что зарезервированные слова не распознаются, за исключением определенных позиций во входных данных, например, после или ; грамматика предполагает, что если зарезервированное слово предназначено, оно правильно разграничено пользователем

    . Было бы неприятно, если бы «then», другое зарезервированное слово, нельзя было использовать как обычное слово, так что в основном это имеет смысл. ( и ) , напротив, являются операторами, могут появляться где угодно, и их нужно экранировать, если они используются для своих буквальных значений. По сути, это исторический артефакт, и, возможно, будет сделан более последовательный выбор в том или ином направлении, или, возможно, потребуется более сложный синтаксический анализатор.


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

    Существует выбор, поддерживать ли историческую совместимость в крайнем случае или нет, и некоторые другие оболочки, такие как zsh, имеют более умные синтаксические анализаторы и могут работать с {date} в том смысле, который вы намеревались .

4
03.05.2016, 02:21
2 ответа

Самым чистым эквивалентом POSIX будет

tail -r

, поскольку

-r          Reverse. Copies lines from the specified starting point in
            the file in reverse order. The default for r is to print the
            entire file in reverse order.

был принят для следующего выпуска POSIX (и, надеюсь, скоро он будет поддерживаться на всех платформы).


Если tail -r недоступен, можно успешно использовать «классические» инструменты обработки текста - как вы и другие показали - для переворота строк в файле.
Помимо удобочитаемости и краткости, даже старый ed может это сделать:

ed -s infile <<\IN
g/^/m0
,p
q
IN

или, если это результат конвейера, который вы хотите изменить, - прочитать его в текстовом буфере во-первых:

ed -s <<\IN
r ! your | pipeline | goes | here
g/^/m0
,p
q
IN
3
27.01.2020, 20:49

POSIX vi , как иedилиex .

Я предпочитаю ви себя.

Командный режим, конечно:

:g/^/m0

Вы всегда можете указать :g диапазон, если не хотите реверсировать весь файл, при условии, что вы обращаете внимание на то, где и как вы перемещаете объекты:

:1,10g/^/m0

Переключатель «-r» на tail не соответствует стандарту POSIX -на момент написания этой публикации:

tail [-f] [-c number|-n number] [file]
0
26.04.2021, 19:22

Теги

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