Отрицаем часть рисунка с помощью sed

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

sed -r Ɔ,/^[a-z0-9]* (ALL=(ALL) ALL)/s//abc 1
&/'

Мой ввод - файл /etc/sudoers .

Я хотел бы изменить ^[a-z0-9]* на что-то вроде /^ABC/! но это не работает для меня.

Всего 2 ответа


Я не уверен в этом. Тем не менее, я предполагаю, что вам нравится удалять abc из вашей строки, что может помочь вам сделать это выражение:

([^abc]*)(.*)

введите описание изображения здесь

#!/bin/bash
STRING="(ALL=(ALL) ALL)/s//abc"
MATCH="$(sed 's/([^abc]*)(.*)/1/' <<< $STRING)"
echo $MATCH

Выход

(ALL=(ALL) ALL)/s//

RegEx

Если это не было вашим желаемым выражением, вы можете изменить / изменить выражения в regex101.com .

RegEx Circuit

Вы также можете визуализировать ваши выражения в jex.im :

введите описание изображения здесь


Замена первого вхождения в файле

Если я понимаю ваш вопрос, и вы хотите найти первую строку в файле, которая соответствует ^[a-z0-9]+ ALL=(ALL) ALL и заменить ^[a-z0-9]+ ALL чем-то вроде ^ABC с помощью расширенного регулярного выражения , вы можете использовать:

sed -r Ɔ,/[a-z0-9]+/s/^[a-z0-9]+ ALL(=(ALL) ALL.*$)/^ABC1/'

Просматривая строки без комментариев в /etc/sudoers с доступом sudo предоставленным членам группы wheel , вы получите:

$ noc /etc/sudoers
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL

Таким образом, чтобы заменить первую строку на [a-z0-9]+ ALL=(ALL) ALL в /etc/sudoers на ^ABC=(ALL) ALL , вы должны:

$ noc /etc/sudoers | sed -r Ɔ,/[a-z0-9]+/s/^[a-z0-9]+ ALL(=(ALL) ALL.*$)/^ABC1/'
^ABC=(ALL) ALL
%wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: ALL

Заменить пронумерованное вхождение в строке

Если вы хотите заменить вхождение в строке. С расширенным регулярным выражением, используя s/find/replace/n где n=1,2,3.. является вхождением шаблона find для замены, вы можете заменить первое вхождение, например:

sed -r 's/[0-9a-z]+/cde456/1'

Например:

$ echo "abc123---abc123---abc123" | sed -r 's/[0-9a-z]+/cde456/1'
cde456---abc123---abc123

Или чтобы заменить второе вхождение, вы должны использовать:

$ echo "abc123---abc123---abc123" | sed -r 's/[0-9a-z]+/cde456/2'
abc123---cde456---abc123

Такое же сопоставление вхождений доступно с базовыми регулярными выражениями, у вас просто нет '+' (соответствует одному или нескольким вхождениям), вы должны изменить шаблон find , например

sed 's/[0-9a-z][0-9a-z]*/cde456/1`

заменить искомое вхождение без использования расширенного регулярного выражения.


Есть идеи?

10000