sed 's/ \ ([0 -9]\ )\/\ ([0 -9]\ )/ \2\/\1 /' имя_файла

Я предполагаю, что вы работаете с относительно новым дистрибутивом Linux, поэтому вам может понадобиться обратиться к руководству systemd, так как SysVбольше не используется в установках дистрибутива по умолчанию, и это, скорее всего, ваша проблема.. systemdдопускает зависимости запуска, когда вы указываете, какие сценарии запускаются раньше других.

Проверить следующую ссылку

-2
08.08.2020, 11:10
1 ответ

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 global )не указан, в каждой строке будет подставлено только первое совпадение.

Итак, здесь это означает, что он заменяет не более одного <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.

4
18.03.2021, 23:14

Теги

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