я не читаю глубже man setfacl
,но кажется, вам это нужно.
man setfacl
часть содержимого:
ПРИМЕРЫ
Предоставление дополнительному пользователю прав на чтение setfacl -m u:lisa:r файл Отзыв прав на запись для всех групп и всех именованных пользователей (используя действующую маску прав) setfacl -m файл m::rx Удаление записи именованной группы из ACL файла setfacl -x g:файл персонала Копирование ACL одного файла в другой получитьфакл файл1 | setfacl --set-file=- файл2 Копирование ACL доступа в ACL по умолчанию getfacl --доступ к каталогу | setfacl -d -M- директор
grep
предназначен только для (и первоначально )печатал (только )строки, соответствующие шаблону. Вот что grep
означает (на основе командыg/re/p
ed
).
Некоторые grep
реализации добавили несколько функций, которые немного ущемляют роль других команд. Например, у некоторых есть несколько -r
/ --include
/ --exclude
для выполнения части работы find
.
В GNU grep
добавлена опция -o
, которая заставляет выполнять часть работы sed
, позволяя редактировать совпадающие строки.
pcregrep
расширил его с помощью -o1
, -o2
... для печати того, что соответствует группам захвата. Таким образом, с этой реализацией, хотя она и не была предназначена для этого, вы можете фактически заменить:
sed 's/old/new/'
с:
pcregrep --om-separator=new -o1 -o2 '(.*?)old(.*)'
Однако это не работает должным образом, если группы захвата соответствуют пустой строке.На входе типа:
XoldY
Xold
oldY
это дает:
XnewY
X
Y
Вы можете обойти это, используя еще более неприятные приемы, такие как:
PCREGREP_COLOR= pcregrep --color=always '.*old.*' |
pcregrep --om-separator=new -o1 -o2 '^..(.+?)old(.+)..' |
pcregrep -o1 '.(.*).'
То есть добавьте и добавьте\e[m
(раскрашивающую escape-последовательность )ко всем совпадающим строкам, чтобы убедиться, что по обе стороны от old
есть хотя бы один символ, и затем удалите их.
Нет, grep не может выполнять замены (за один вызов), вот почему возникла явная потребность в sed (а позже и в awk как лучшем языке для обработки текста).