Один путь мог быть:
sed '/^DESCRIPTION$/,/^[^ ]/!d' <(man cat) | head -n -1 > cat-man
Отметьте ту отрицательную величину head
не POSIX.
То, что вы, возможно, упускаете - с которым у многих возникают проблемы, особенно если у них есть опыт работы с другими операционными системами до того, как они перейдут на * nix - это то, что во многих других ОС обычно передаются подстановочные знаки в командной строке к команде обрабатывать так, как считает нужным. Например, в командной строке Windows
rename *.jpeg *.jpg
, в то время как в * nix, чтобы упростить работу
программиста (ов) отдельных команд (например, mv
), подстановочные знаки
(если они не заключены в кавычки или экранированы) обрабатываются оболочкой,
способом, не зависящим от интерфейса и функциональности
команды, для которой подстановочные знаки являются аргументами.
Большинство программ, которые принимают имена файлов в качестве аргументов командной строки, ожидают, что эти файлы существуют.
(да, mkdir
и touch
- исключения из этого правила,
а также mkfifo
, mknod
и, частично, cp
, ln
, mv
и переименовать
;
а есть наверное другие),
поэтому оболочке не имеет смысла расширять подстановочные знаки
к именам несуществующих файлов.
А для оболочки (и под этим я подразумеваю каждую оболочку -
Bourne, bash, csh, fish, ksh, zsh и т. Д.), Чтобы обрабатывать исключения по-разному.
вероятно, было бы слишком хлопотно.
Тем не менее, есть несколько способов добиться желаемого результата. Если вы знаете, до чего будет расширяться подстановочный знак, и это недолго, вы можете сгенерировать его с помощью фигурных скобок:
touch {red,orange,yellow,green,blue,indigo,violet}/rgb.txt
Более общее решение:
sh -c 'for arg do mkdir -- "$arg"/test; done' -- *
Жиль помог мне найти другой способ сделать это в bash.
benbradley=(*)
mkdir "${benbradley[@]/%//test}"
Очевидно, benbradley
здесь просто идентификатор; вы можете использовать любое имя
(например, любая буква).
Мне потребовалось несколько попыток, чтобы понять это правильно, поэтому позвольте мне разбить его:
идентификатор = значение
создает (скалярную) переменную с именем идентификатор
(если он еще не существует) и присваивает ему значение value
.
Например, G = Мужчина
.
Вы можете ссылаться на скалярную переменную с помощью $ идентификатора
;
например, $ G
или, что более безопасно, как $ { идентификатор }
.
Например, $ Gage
и $ Gilla
могут быть неопределенными,
но возраст $ {G}
равен Управлять
, а $ {G} illa
- Манилла
. идентификатор = ( значение 1 значение 2 … )
создает переменную массива с именем идентификатор
(если он еще не существует) и присваивает ему перечисленные значения.
Например, спектр = (красный оранжевый желтый зеленый синий индиго фиолетовый)или
all_text_files = (*. Txt)
$ name
будет ссылаться на первый элемент (и поэтому бесполезен).
Вы можете ссылаться на произвольный элемент как $ { name [ индекс ]}
;
например, $ {спектр [0]}
красный
и $ {спектр [4]}
- синий
.
И вы можете использовать $ { name [@]}
и $ { name [*]}
для ссылки на весь массив.
Итак, вот оно по частям:
"$ {benbradley [@] /% / / test}"
$ { параметр / шаблон / строка }
расширяет параметр $ { }
и заменяет самое длинное совпадение
из паттерна
со строкой
. шаблон
начинается с #
,
он должен соответствовать началу расширенного значения параметра
.
Если шаблон
начинается с %
,
он должен соответствовать в конце расширенного значения параметра
.
Другими словами, % (the-rest_of_the_pattern)действует как
(the-rest_of_the_regex) $(да, это кажется немного назад). Итак, шаблон
, это просто %
похоже на регулярное выражение, которое представляет собой просто $
-
он соответствует концу входной строки (область поиска).
строку
из / test
.Таким образом, конец параметра заменяется на / test
(т.е. он добавляет к параметру / test
). $ { параметр / шаблон / строка }
что не интуитивно понятно, так это то, что всегда заканчивается на }
.
Это не обязательно, и не может заканчиваться третьим /
.
Следовательно, /
в строке
нельзя интерпретировать как разделитель,
и поэтому у нас может быть строка
из / test
без необходимости выходить из /
. параметр
является переменной массива
с индексами @
или *
,
операция подстановки применяется по очереди к каждому члену массива. $ { name [@]}
(вместо $ { name [*]}
) и заключите результаты в двойные кавычки,
вы сохраняете целостность элементов массива
(т.е. вы сохраняете в них пробелы и другие специальные символы)
без объединения отдельных элементов в одно длинное слово. Шаблон подстановочного знака расширяется оболочкой перед вызовом команды. См. ответ G-Man для полного объяснения.
Большинству оболочек требуется некоторая форма промежуточной команды, чтобы применить преобразование текста к совпадениям. Zsh предлагает способ преобразования совпадений на лету с помощью квалификаторов glob :
e
или +
для выполнения кода для каждого совпадения, который может изменить совпадение путем модификации строка REPLY
(или даже изменить количество совпадений, изменив массив reply
) :
, за которым следует модификатор раскрытия истории для применения некоторые встроенные преобразования Примеры:
mkdir */(:s:/:/test:) # takes advantage of the fact that each match ends with /, which it replaces by /test
mkdir *(/e:REPLY+=/test:)