Я предполагаю, что вы работаете с относительно новым дистрибутивом Linux, поэтому вам может понадобиться обратиться к руководству systemd
, так как SysV
больше не используется в установках дистрибутива по умолчанию, и это, скорее всего, ваша проблема.. systemd
допускает зависимости запуска, когда вы указываете, какие сценарии запускаются раньше других.
sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' filename
будет кодом, допустимым в большинстве оболочек Unix.
В оболочках символ пробела используется для разделения токена в его синтаксисе, а '...'
используется для кавычек / экранирования строк, что для оболочки означает удаление особое значение символов . В этом случае это означает, что символы пробела и обратной косой черты внутри '...'
не обрабатываются оболочкой специально.
Первое слово sed
, которое не является ключевым словом в синтаксисе оболочки, интерпретирует эту строку как простой вызов команды. Я буду искать команду sed
в $PATH
и выполнять первую найденную в дочернем процессе с sed
, s/ \([0-9]\)\/\([0-9]\) / \2\/\1 /
и filename
в качестве аргументов.
sed
сам по себе является интерпретатором другого языка, языка sed
.
Если сценарий не передается с помощью параметров -e
или -f
, первый аргумент параметра, не являющийся параметром -, который получает sed
, считается сценарием для его интерпретации.
Вот, s/ \([0-9]\)\/\([0-9]\) / \2\/\1 /
.
sed
обрабатывает свой ввод (здесь из filename
файла )по одной строке за раз (с текущей строкой, загруженной в sed
пространство шаблонов ), и для каждой строки интерпретирует код предоставленного скрипта и выводит результирующее пространство шаблонов на стандартный вывод.
Здесь этот скрипт состоит из одной и только одной sed
команды, :замещающей команды s
.
Его синтаксис s%pattern%replacement%flags
, где вместо %
можно использовать любой символ¹.
Здесь автор использовал /
вместо %
. Это чаще всего используется, но здесь это был плохой выбор, так как /
используется как в шаблоне, так и в замене, поэтому его пришлось экранировать с помощью \
.
Таким образом, шаблон " \([0-9]\)/\([0-9]\) "
. В sed
шаблонами являются базовые регулярные выражения(BRE ). В БРЭ:
/
совпадают сами с собой, так как не являются специальными [set]
соответствует одному элементу сортировки в указанном наборе. Когда этот набор содержит x-y
, он соответствует элементам сортировки, которые сортируются между x
и y
. Для 0-9
это включает как минимум 0123456789 символов, но, возможно, больше в зависимости от локали, ОС и реализации sed
. \(...\)
используется для группировки, а также для захвата . То есть то, что сопоставляется с тем, что внутри, будет захвачено и доступно в замене как \1
для первой группы захвата, \2
для второй и т. д. Замена здесь " \2/\1 "
, где \2
и \1
— это то, что было сопоставлено первыми 2 группами захвата в шаблоне.
В вашем случае список флагов пуст, и, в частности, поскольку флагg
(for g
lobal )не указан, в каждой строке будет подставлено только первое совпадение.
Итак, здесь это означает, что он заменяет не более одного <SPC><a-digit><slash><another-digit><SPC>
на <SPC><another-digit><slash><a-digit><SPC>
в каждой строке в пределах filename
и выводит результат на стандартный вывод.
Так, например, с filename
, который содержит:
a 1/2 b 3/4
test
c4/5 6/7 d
Выводится:
a 2/1 b 3/4
test
c4/5 7/6 d
¹ кроме обратной косой черты и новой строки и с несколькими реализациями sed
многобайтовых символов. Вам также следует избегать символов, отличных от -ASCII, и если вам нужно, чтобы шаблон или замена включали символы, отличные от -ASCII, символы, кодировка которых не встречается в других символах, что на практике оставляет только !"#$%&' ()*+,-./:;<=>?
, если мы также исключить управляющие символы ASCII.