#sed #sh #configure
#sed #sh #настройка
Вопрос:
Я неплохо разбираюсь в bash, и мне нравится учиться, просматривая чужие работы и файлы, которые я получаю из загрузок, и я наткнулся на это в файле конфигурации.
# Name of the executable.
as_me=`$as_basename "$0" ||
$as_expr X/"$0" : '.*/([^/][^/]*)/*$' |
X"$0" : 'X(//)$' |
X"$0" : 'X(/)$' |
. : '(.)' 2>/dev/null ||
echo X/"$0" |
sed '/^.*/([^/][^/]*)/*$/{ s//1/; q; }
/^X/(//)$/{ s//1/; q; }
/^X/(/).*/{ s//1/; q; }
s/.*/./; q'`
Кто-нибудь может объяснить, как это работает? Я вижу много людей, использующих команду sed с кучей косых черт вперед и назад для замены и еще много чего, но это кажется абсурдным.
Комментарии:
1. Из какого конфигурационного файла это взято?
2. Вместо этого вы должны заменить старые обратные тики на круглые скобки. var=$(код)
3. Ну, поскольку это не мое, я могу согласиться. Если вы хотите предложить это производителю, просто погуглите, кто создал gtk-server-2.3.1
4. Ужасающий внешний вид, вероятно, связан с необходимостью работать с как можно большим количеством реализаций
sh
иsed
, включая некоторые, которые могут даже предшествовать стандарту POSIX.5. Потенциально могут быть запущены 3 разные команды: одна с именем
$as_basename
, одна с именем$as_expr
и в качестве последнего средстваsed
.as_basename
иas_expr
, скорее всего, являются командами POSIXbasename
иexpr
соответственно.
Ответ №1:
Прежде всего я бы определенно посоветовал проверить эту ссылку
И, во-вторых, я углублюсь в некоторые sed
вещи:
sed '/
: Это начало поиска по регулярному выражению^.*
: Выполните поиск в начале строки (^
) и найдите любое количество (т. Е. ноль или больше:*
) любого символа (.
) Пожалуйста, обратите внимание, что когда^
используется внутри[]
, это означает, что его НЕТ в списке/([^/][^/]*)
: Затем найдите косую черту, за которой следует группа символов, не содержащих косой черты ([^/][^/]*
).(...)
обозначает группу, на которую можно ссылаться позже. Я вернусь к этому позже./*$
: Затем выполните поиск любого количества косых черт, а затем конца строки ($
)/
: Появление второй, неэкранированной косой черты отмечает конец регулярного выражения и начало того, чтоsed
должно произойти, когда он находит строку, соответствующую регулярному выражению{ s//1/; q; }
: К сожалению, я не знаю точно, для чего предназначены фигурные скобки. Обычно они используются для групповой команды, но я никогда не видел, чтобы она использовалась в этой части косых черт. В любом случае, как упоминалосьsed
, позволяет выполнять обратную ссылку.1
ссылается на первую (и единственную) группировку между первыми двумя косыми чертами, а именно[^/][^/]*
.q
Используется для выхода изsed
после завершения этой команды, но поскольку она заключена в фигурные скобки, я не совсем уверен, как это влияет на всю команду.
В любом случае, это должно дать хорошее представление о том, как sed
работает. Из того, что я могу сказать, кажется, что sed
просматривает путь к файлу и захватывает одну его часть. Например, он передан some/crazy/file/location.ext
, он вернет crazy
Надеюсь, это помогло! Обязательно ознакомьтесь с этой ссылкой, потому что это действительно полезный инструмент, как только освоитесь с ним. О, и если вы когда-нибудь будете использовать sed
, пожалуйста, пожалуйста, пожалуйста, используйте :
or _
или даже |
в качестве разделителя!! Это предотвращает отвратительный вид штакетника, как sed
см. Выше. Это можно было бы записать как
sed ':^.*/([^/][^/]*)/*$:{ s::1:; q; }
:^X/(//)$:{ s::1:; q; }
:^X/(/).*:{ s::1:; q; }
s:.*:.:; q'
который, я признаю, нелегко понять, но его легче читать.