LINUX.ORG.RU

Sed удаление строк только из части файла


0

1

Добрый день, подскажите пожалуйста, имеется файл alias с таким содержымым:

group:user1,user2,user3,user4,user5.....

stan:user3,user7,user9......

#Begin users

Petrov user1

Ivanov user2

Galov user3

..........................

Необходимо удалить строки содержащие user1,user3...... в блоке который идет после #Begin users, допустим если удаляется user1, то он удаляется из нижнего блока, удаляется вся строка

Petrov user1

а в верхнем блоке удалялась только запись user1 а не вся строка. Пытался написать скрипт, но он удаляет все строки с записью user1, а пропустить часть файла до записи #Begin users не получается, подскажите как правильно ет зделать. Мною написаный скрипт:

#!/bin/bash

if [ $# -ne 2 ]

then

echo «Для работы скрипта требуется 2 аргумента: 1)файл из которого брать пользователей для удаления 2)файл в котором данные пользователи будут удалятся

else

echo „Количество аргументов верно Начинается удаление ползователей по списку $1“

cat $1 | while read line

do

if [ -n »$line" ]

then

sed -i «/$line$/d» «$2»

fi

fi

done

exit 0;

что нужно добавить, что б пропустить первый блок файла, и вносить изменения после записи #Begin users Подскажите пожалуйста, не знаю в каком направлении рыть. У меня стала проблема, как обрабатывать только часть файла а не весь файл.

что б пропустить первый блок файла, и вносить изменения после записи #Begin

Все не осилил прочитать/вникнуть, а так: /^#Begin/,$

anonymous ()

sed -e '0,/^#Begin users/{s/user1//g}' -e '/^#Begin users/,${/user1/d}'

io ★★ ()

небось запятую тоже?
sed -e '0,/^#Begin users/{s/user1[,]*//g}' -e '/^#Begin users/,${/user1/d}'

или

sed -i -e '0,/^#Begin users/{s/'«$1»'[,]*//g}' -e '/^#Begin users/,${/'«$1»'/d}' «$2»

io ★★ ()
Ответ на: комментарий от meranil

незапятая много раз. Или мало или вообще нет. удалить. В силу жадности * удаляет всё до первой запятой. Могу и подробнее...

drBatty ★★ ()
Ответ на: комментарий от meranil

user1 м.б. в одной строке много:

$ echo «user1 xyz user1» | sed -e 's/user1//g'
xyz
$ echo «user1 xyz user1» | sed -e 's/user1//'
xyz user1

Запятая может быть, а может не быть:

$ echo «user1 user1» | sed -e 's/user1[,]*//'
user1
$ echo «user1, user1» | sed -e 's/user1[,]*//'
user1
$ echo «user1,,, user1» | sed -e 's/user1[,]*//'
user1

io ★★ ()
Ответ на: комментарий от meranil

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

text:user

text1:

нужно перед строкой text1 поставить #, то есть закоментировать ее, написал такой код но почему то не работает :(

sed -i «s/^*:*$/^/\#&/»

и возможно ли как то сюда вписать проверку если # уже стоит вначале то пропустить данную строку.

meranil ()
Ответ на: комментарий от meranil

нужно перед строкой text1 поставить #, то есть закоментировать ее

sed '/^text1:/s/^/#/'

если # уже стоит вначале то пропустить данную строку

sed '/^#/d'
uzbl ()

а если не известно имя строки для коментирования (text1), пытался сделать замену но не получилось, что неправильно делаю?

sed «/^*:*$:/s/^/#/»

meranil ()
Ответ на: комментарий от meranil

что неправильно делаю?

не можешь сформулировать задачу; не читаешь man 7 regex

а если не известно имя строки для коментирования

а каковы критерии строки для комментирования?

anonymous ()

критерий строки коментирования, если в конце строки стоит : и дальше ничего не идет, то такую строку надо закоментировать

meranil ()
Ответ на: комментарий от meranil

если в конце строки стоит : и дальше ничего не идет, то такую строку надо закоментировать

sed '/:$/s/^/#/'

всё просто

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.