Как эта команда «sed» замещения с множеством знаков @ работает?

(sleep 10; xset dpms force suspend) & xdg-screensaver lock

Запускает экранную заставку в режиме блокировки, а затем помещает ваш дисплей в режим ожидания. Ubuntu Mate 15.10

8
задан 5 October 2017 в 09:27

4 ответа

Это красота sed, она применяет свои парадигмы к себе ... После команды (например, s или tr или ничего) следующий символ считается разделителем.

Вы должны разумно выбирать, чтобы избежать помех в оболочке и самой команде, и сохранить читаемость, но совершенно правильно написать что-то ужасное, как:

echo 'arrival' | sed srarbrg

... и получить brrivbl, в результате чего вы ожидаете. Вы можете повеселиться, сделав его действительно загадочным, например:

echo 'arrival' | sed s\fa\fb\fg # \f is form feed, chr(12)

. Обычно используется слэш как разделитель, но когда ваше выражение содержит разделитель, оно облегчает захват того, что намерение есть. Ваш разделитель может быть любым в диапазоне ASCII8 (многобайтовые разделители, такие как £, вызывают ошибку).

Просто помните, что цель - сделать вещи проще, а не более загадочными.

3
ответ дан 18 July 2018 в 05:47

В sed команды замены обычно записываются как s/pattern/replacement/options. Однако нет необходимости использовать / - вы можете использовать другие символы, если это удобно, поэтому это может быть s@pattern@replacement@options или s:foo:bar:g. s@+@ @g походит на s/+/ /g - замените все + на пробелы. Аналогичным образом s@%@\\x@g заменяет все % на \x (один обратный слэш - это escape-символ в sed, поэтому вам нужно два, чтобы получить реальную обратную косую черту).

Затем строка, подобная foo+%2Fbar, стать foo \x2Fbar. printf "%b" будет расширять последовательности с экранами с обратным слэшем, такие как \x2F (символ ASCII, чье шестнадцатеричное значение равно 2F, которое равно /), чтобы дать вам foo /bar.

15
ответ дан 18 July 2018 в 05:47

Это красота sed, она применяет свои парадигмы к себе ... После команды (например, s или tr или ничего) следующий символ считается разделителем.

Вы должны разумно выбирать, чтобы избежать помех в оболочке и самой команде, и сохранить читаемость, но совершенно правильно написать что-то ужасное, как:

echo 'arrival' | sed srarbrg

... и получить brrivbl, в результате чего вы ожидаете. Вы можете повеселиться, сделав его действительно загадочным, например:

echo 'arrival' | sed s\fa\fb\fg # \f is form feed, chr(12)

. Обычно используется слэш как разделитель, но когда ваше выражение содержит разделитель, оно облегчает захват того, что намерение есть. Ваш разделитель может быть любым в диапазоне ASCII8 (многобайтовые разделители, такие как £, вызывают ошибку).

Просто помните, что цель - сделать вещи проще, а не более загадочными.

3
ответ дан 24 July 2018 в 18:26
  • 1
    Запуск с загадочной идеей, это действительная команда sed, хотя она не делает ничего полезного: sed "snack is an apple or something" <<< "I sed your snack is an apple or something" – wjandrea 5 October 2017 в 04:56
  • 2
    Ницца! Да, вы можете использовать команды sed в качестве мозговых дразнилок, насколько это уродливо? – Marabiloso 5 October 2017 в 15:12

В sed команды замены обычно записываются как s/pattern/replacement/options. Однако нет необходимости использовать / - вы можете использовать другие символы, если это удобно, поэтому это может быть s@pattern@replacement@options или s:foo:bar:g. s@+@ @g походит на s/+/ /g - замените все + на пробелы. Аналогичным образом s@%@\\x@g заменяет все % на \x (один обратный слэш - это escape-символ в sed, поэтому вам нужно два, чтобы получить реальную обратную косую черту).

Затем строка, подобная foo+%2Fbar, стать foo \x2Fbar. printf "%b" будет расширять последовательности с экранами с обратным слэшем, такие как \x2F (символ ASCII, чье шестнадцатеричное значение равно 2F, которое равно /), чтобы дать вам foo /bar.

15
ответ дан 24 July 2018 в 18:26
  • 1
    Короче говоря, декодер URL- & gt; filename. – Thorbjørn Ravn Andersen 4 October 2017 в 13:03

Другие вопросы по тегам:

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