But where do I put the w substitution flag if I'm using multiple commands and want the results wrote to a file?
Флаг w
должен заканчиваться символом новой строки или должен быть последним элементом (, включая аргумент it )в сценарии sed. Если будут найдены пробелы, комментарии или точки с запятой, они будут включены в имя файла.
Не путайте флаг w
, связанный с подстановкой команды s
(s///w
), и команду w
. Они похожи, но флаг w
используется только в том случае, если выполняется замена. Обратите внимание, что команда w
может использоваться условно или безоговорочно в зависимости от сценариев использования sed ().
Примечание :опцияi
(--in-place
)не указана в POSIX.
Первый пример
prompt% sed -i.back -e "/$regex/w output" -e "/$regex/d" input
Второй пример
prompt% sed -i.back "/$regex/ {
w output
d;}" input
Кто-то может столкнуться с проблемой в вашем случае(см. ниже ), поскольку в одной и той же строке ввода выполняется несколько подстановок.
prompt% sed -n '4 {
s/fox/wolf/w output
s/dog/bear/w output
}' input
Изменена только одна входная строка, но выходной файл содержит две строки.
The quick brown wolf jumps over the lazy dog
The quick brown wolf jumps over the lazy bear
Этот результат неудобен, поскольку вводит в заблуждение.
I want to write the whole output to the file, a copy of the original with the changes made.
Мое решение позволяет создать резервную копию исходного файла (input.back
), применить изменения в исходном файле(input
)и записать потенциальные замены в другой файл(output
). Этот алгоритм использует команду w
.
prompt% sed -i.back -nE '4!p # print line except 4th
4!d # delete line except 4th
/fox|dog/!p # print line if no "fox" or no "dog"
/fox|dog/!d # don't delete line if "fox" or "dog"
s/fox/wolf/ # substitution occurs if "fox"
s/dog/bear/ # substitution occurs if "dog"
p # if a substitution then print 4th line
w output' input # if a change then save 4th line in "output"
Команда /fox|dog/!d
немедленно запускает следующий цикл, если fox
или dog
не найдено (ни одно из них ). Поэтому, если ключевое слово не найдено, следующие команды (s///
, p
,w
)для текущей строки не обрабатываются.
Движения мыши приводят к тому, что расширение DPMS на сервере X11 активирует монитор. Один из способов остановить это — отключить устройство мыши перед запуском slimlock
и повторно -включить его после этого. Сначала найдите имя мыши, используя xinput --list
. Для меня это было Logitech USB Optical Mouse
.Затем вы можете отключить его с помощью
dev='Logitech USB Optical Mouse'
xinput --disable "$dev"
При возвращении из slimlock
используйте ту же команду с --enable
.
Если вам нужно, чтобы мышь снова стала активной после того, как вы начнете использовать клавиатуру, например, чтобы щелкнуть какой-либо значок, вам потребуется опросить состояние монитора и заметить, когда он включается, что указывает на использование клавиатуры. Вы можете сделать это, скажем,
while xset q | grep -q 'Monitor is Off'
do sleep 15
done
xinput --enable "$dev"
Чтобы избежать немедленного обнаружения того, что монитор включен в начале, вы можете добавить подходящий спящий режим перед этим циклом.