Извлечение справки обменивается сообщениями из самого сценария

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

3
30.09.2012, 19:29
6 ответов

Попробуйте это:

#!/bin/bash
#
# foo - do things
# Author: John Doe <jhon@doe>
# ----------------------------------------------
# SYNOPSIS
#   foo [OPTIONS] FILE
# 
# DESCRIPTION
#   At vero eos et accusamus et iusto odio
#   dignissimos ducimus qui blanditiis praesenti
#   voluptatum deleniti atque corrupti quos.
# ----------------------------------------------


cat `which $0` | sed -n '0,/# -\+$/d;/# -\+$/,$d;p'
2
27.01.2020, 21:11

Можно также выполнить это с awk:

awk '/^# --/{ flag=!flag; next}; flag' file

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

2
27.01.2020, 21:11
  • 1
    Это печатает желаемый вывод плюс две пустых строки и затем cat ... строка. –  Pedro Lacerda 30.09.2012, 04:50
  • 2
    я хотел бы видеть awk решение. –  Pedro Lacerda 30.09.2012, 04:50
  • 3
    Извините: Я неправильно читал вопрос... –  jasonwryan 30.09.2012, 04:58
  • 4
    О, спасибо. Вы возражаете, объясняют немного? –  Pedro Lacerda 30.09.2012, 05:03
  • 5
    Обновленный: надежда, которая помогает. –  jasonwryan 30.09.2012, 06:53

Вы могли сделать это симпатичный просто с awk:

awk -v RS='\n# -+' 'NR==2' $0

RS наборы к разделителю записей соответственно и NR==2 печатает вторую запись.

Можно удалить знак комментария и дополнительное пространство с gsub, например:

awk -v RS='\n# -+' 'NR==2 { gsub("\n# ", "\n"); print }' $0

Обновление

Для предотвращения пустой первой строки добавляют \n кому: RS, но теперь первой строкой не заменяют gsub, так gensub требуется:

awk -v RS='\n# -+\n' 'NR==2 { print gensub("(^|\n)# ", "\\1", "g") }' $0
2
27.01.2020, 21:11
  • 1
    Очень понятный ответ. Первая строка пуста, я пытался удалить с gsub(/\n?\n# /, "\n") без успеха. –  Pedro Lacerda 30.09.2012, 15:11
  • 2
    я вижу то, что Вы имеете в виду, я добавлю и обновлю, который фиксирует его. –  Thor 30.09.2012, 18:14

Вместо того, чтобы прикреплять Ваше сообщение в комментарии в начале файла, можно также эмулировать __DATA__ раздел Perl и некоторых других языков программирования путем выхода перед сценарием достигает его:

#!/bin/sh

data=$(sed '0,/^__DATA__$/d' "$0")
printf '%s\n' "$data"

exit

__DATA__
FOO BAR BAZ
LLAMA DUCK COW

То же общее представление как другие находящиеся в sed решения, все же.

1
27.01.2020, 21:11
  • 1
    Также: Когда Вам удается избавиться от привычки использования ls, можно использовать в своих интересах xargs -0 ---------121 человек--------75242----, это прохладно. Мне понравилась идея meta информации (вне комментариев) сохраненный на исходном коде. Я предпочитаю документацию относительно вершины, но уверенный я найду некоторое использование для этого. –  Pedro Lacerda 30.09.2012, 22:46

То, в чем Вы нуждаетесь, называют "здесь документ". К счастью, это уже реализовано в ударе. Проверьте следующий URL http://tldp.org/LDP/abs/html/here-docs.html

Вы просто используете следующее:

cat <<end-of-message
----------------------------
message lines...
----------------------------
end-of-message

Можно добавить условное выражение наверху сценария для печати этого, только если параметр вводится или что-то... как-h опция или при отсутствии существующих аргументов.

1
27.01.2020, 21:11
  • 1
    Извините, я не понимаю, как heredocs мог помочь мне. –  Pedro Lacerda 30.09.2012, 06:36

Это могло бы работать на Вас (GNU sed):

 sed '/^# -\+$/,//!d;//d' $0

Объяснение:

  • /^# -\+$/,//!d удалите все не между разделителями
  • //d удалите разделители и позвольте остатку пройти

N.B. // снова использует последний regexp.

0
27.01.2020, 21:11
  • 1
    Если это будет работать, то будет лучшее решение IMO. –  Pedro Lacerda 05.10.2012, 08:34

Теги

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