Кто-нибудь может объяснить мне синтаксис команды sed здесь?

Для этого в Solaris используется команда last.

Это покажет вам последний раз, когда пользователь timвходил в систему.

bash-[510]$ last -1 tim
tim       pts/1        192.168.0.106    Wed Jun 13 18:16   still logged in

Если этот пользователь не входил в систему с момента ротации базы данных, вы не получите никакого вывода.

bash-[511]$ last -1 tom

wtmp begins Fri Mar 27 19:57
1
17.05.2020, 19:35
1 ответ
  1. -eозначает, что «следующим аргументом командной строки является выражение sed».
  2. -iозначает «выполнить это редактирование в -месте , т.е. изменить исходный файл». Эта опция не является стандартом -и может вызвать путаницу при переходе между различными реализациями sedв разных системах Unix. См., например. Как добиться переносимости с помощью sed -i (в -редактирование места )?
  3. /.*— это начало регулярного выражения для соответствия тексту, который предполагается заменить. На самом деле это /, разделитель дляs///(команды подстановки )в sedи начало регулярного выражения .*extra_star_job_inlist2_name.*. .*само по себе означает «соответствие любому числу любого символа».

    .*также встречается в конце выражения .*extra_star_job_inlist2_name.*, и в результате любая строка, содержащая строку extra_star_job_inlist2_name, будет полностью заменена (, т. е. подстановка повлияет не только на строку extra_star_job_inlist2_name. ] в строке ).

  4. /iснова является разделителем /для команды s///в sed, за которым следует флаг для команды s///. Этот флаг не является стандартом -, доступен только в версии GNU sed. Флаг делает соответствие регистра выражения -нечувствительным. См. документацию GNU sedоб этом.

  5. Странные цитаты вокруг$controls:

    • Выражение sedдается в строке с одинарными кавычками. Поскольку это одна строка в кавычках, переменная не будет раскрываться внутри нее. Чтобы вставить значение переменной, сначала должна заканчиваться строка в одинарных кавычках. Это первый '.
    • Затем, видимо, автор кода хочет вставить буквальную одинарную кавычку. Для этого они цитируют его :"'". Они также могли бы использовать здесь \'.
    • Затем по какой-то причине следует пустая строка в одинарных кавычках,''
    • Затем следует значение$controls(без кавычек ).
    • Еще одна пустая строка в двойных кавычках, "".
    • Еще одна одинарная кавычка, "'".
    • Затем выражение sedпродолжается как строка с одинарными кавычками.

Есть несколько проблем с кавычками вокруг$controls:

  1. Есть две пустые строки.
  2. Расширение $controlsне заключено в кавычки.

Лучшим вариантом, который позволяет избежать этих проблем, является

sed -i -e "s/.*extra_star_job_inlist2_name.*/extra_star_job_inlist2_name = '$controls'/i" "$MESA_INLIST"

т.е. просто используйте строку в двойных кавычках для всего sedвыражения (, а также правильно заключайте в кавычки $MESA_INLIST, которые, кстати, не нужно экспортировать сexport). Это будет работать, если само выражение sedне содержит обратной косой черты или символов $(, их необходимо экранировать как \\и\$).

Или, чтобы немного сократить его, используйте группу захвата, чтобы захватить строку, которую вы хотите повторить в тексте замены,

sed -i -e "s/.*\(extra_star_job_inlist2_name\).*/\1 = '$controls'/i" "$MESA_INLIST"

(и аналогично для другой команды sed.)

Чтобы по-прежнему использовать одинарные кавычки перед выражением sed, вы можете сделать

sed -i -e 's/.*\(extra_star_job_inlist2_name\).*/\1 = '"'$controls'"'/i' "$MESA_INLIST"

Другой оптимизацией будет объединение обоих вызовов sedв один вызов :

.
sed -i -e "s/.*\(extra_star_job_inlist2_name\).*/\1 = '$controls'/i" \
       -e "s/.*\(extra_controls_inlist2_name\).*/\1 = '$controls'/i" "$MESA_INLIST"
2
28.04.2021, 23:13

Теги

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