Замените (один или )два разных шаблона в файле на регулярное выражение

Бит setgid вам не поможет -он влияет только на право собственности, а не на то, что владелец может делать с файлом.

Что может сработать, если общая область хранения смонтирована в другой файловой системе. Вам нужно будет попросить администратора смонтировать его с явно установленным правильным umask, чтобы вы могли обмениваться файлами. Или файлы монтируются с помощью внутренней -только общей папки samba -, что является излишним, но samba легко допускает определенную группу и модель разрешений по сравнению с тем, что предоставляет ОС.

Одним словом, -некоторые из нас думают, что буква «С» в слове «ИТС» означает обслуживание. Если у них есть требование umask 077, им нужно придумать эффективный способ обмена файлами для вас.

(и бит setgid не работает)

ivan@darkstar:~$ umask
0002
ivan@darkstar:~$ 
ivan@darkstar:~$ umask 077
ivan@darkstar:~$ umask
0077
ivan@darkstar:~$ mkdir te
ivan@darkstar:~$ ls -ld te
drwx------ 2 ivan ivan 4096 Sep  7 18:53 te
ivan@darkstar:~$ umask 2
ivan@darkstar:~$ umask
0002
ivan@darkstar:~$ groups
ivan adm cdrom sudo dip plugdev lpadmin sambashare kvm webdev
ivan@darkstar:~$ sudo chown.webdev te
ivan@darkstar:~$ sudo chmod g+w te
ivan@darkstar:~$ ls -ld te
drwx-w---- 2 ivan webdev 4096 Sep  7 18:53 te
ivan@darkstar:~$ chmod g+rx te
ivan@darkstar:~$ sudo chmod g+s te
ivan@darkstar:~$ ls -ld te
drwxrws--- 2 ivan webdev 4096 Sep  7 18:53 te
ivan@darkstar:~$ cd te
ivan@darkstar:~/te$ umask 077
ivan@darkstar:~/te$ umask
0077
ivan@darkstar:~/te$ touch test
ivan@darkstar:~/te$ ls -l
total 0
-rw------- 1 ivan ivan 0 Sep  7 18:54 test
ivan@darkstar:~/te$ 
1
03.12.2020, 18:37
2 ответа

С помощью обхода вы можете проверить, совпадают ли строки вокруг |или нет. Например:

$ cat ip.txt 
[[foo>a|d]]
[[foo>b|e]]
[[foo>c|f]]

# same as: rg -NP '\[\[([^>]+)>([^|]+)\|(?!\2])([^|]+)]]' -r ':$1:`$3 <$2>`'
$ perl -pe 's/\[\[([^>]+)>([^|]+)\|(?!\2])([^|]+)]]/:$1:`$3 <$2>`/' ip.txt 
:foo:`d <a>`
:foo:`e <b>`
:foo:`f <c>`

(?!\2])— это утверждение с отрицательным просмотром вперед, гарантирующее, что строки вокруг |различны.


Чтобы реализовать и то, и другое, вы можете использовать код Perl в секции замены с флагом e.

$ cat ip.txt
[[foo>a|a]]
[[foo>b|b]]
[[foo>c|c]]

[[foo>a|d]]
[[foo>b|e]]
[[foo>c|f]]

$ perl -pe 's/\[\[([^>]+)>([^|]+)\|([^|]+)]]/":$1:`$3". ($2 eq $3 ? "`" : " <$2>`")/e' ip.txt 
:foo:`a`
:foo:`b`
:foo:`c`

:foo:`d <a>`
:foo:`e <b>`
:foo:`f <c>`

Здесь ($2 eq $3 ? "`" : " <$2>`")выберет строку в зависимости от того, совпадают ли строки вокруг |или нет.

2
18.03.2021, 22:45

Кажется, что мы могли бы разделить эту задачу на 2 -3 отдельные части. Сначала мы сжимаем(-s)и заменяем некоторые символы на tr, чтобы создать «контур» вывода, а затем с помощью sedмы делаем две отдельные замены, одну для двух совпадающих символов и одну, когда они совпадают. разные.

< file tr -s '[<>|]' ':::``' | sed -E 's/(.)`\1`/`\1`/; s/([^:])`(.)`/`\2 <\1>`/'

Тестирование:

$ cat file
[[foo>a|a]]
[[foo>b|b]]
[[foo>c|c]]
[[foo>a|d]]
[[foo>b|e]]
[[foo>c|f]]

$ <file tr -s '[<>|]' ':::``' | sed -E 's/(.)`\1`/`\1`/;s/([^:])`(.)`/`\2 <\1>`/' 
:foo:`a`
:foo:`b`
:foo:`c`
:foo:`d <a>`
:foo:`e <b>`
:foo:`f <c>`
1
18.03.2021, 22:45

Теги

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