Dzieliłem dane wyjściowe, id
aby zapewnić bardziej czytelną listę grup po linii, do której należy użytkownik:
id roaima | sed 's/,/\n\t/g'
uid=1001(roaima) gid=1001(roaima) groups=1001(roaima)
24(cdrom)
25(floppy)
...
822413650 (international (uk) location)
Chciałem oddzielić numer grupy od nazwy w nawiasach, więc rozszerzyłem wyrażenie w ten sposób
id roaima | sed -e 's/,/\n\t/g' -e '2,$s/(/ (/'
Nie działało to jednak tak, jak początkowo oczekiwałem. Drugie wyrażenie wydawało się nie mieć żadnego efektu.
Zamiast tego, aby uzyskać pożądany wynik, musiałem uruchomić dwa osobne sed
polecenia, takie jak to:
id roaima | sed -e 's/,/\n\t/g' | sed '2,$s/(/ (/'
uid=1001(roaima) gid=1001(roaima) groups=1001(roaima)
24 (cdrom)
25 (floppy)
...
822413650 (international (uk) location)
Dlaczego potrzebuję dwóch sed
poleceń w potoku zamiast jednego z wieloma instrukcjami? A jeśli mogę to zrobić za pomocą jednego sed
, jak mam to zrobić?
Szczególnie chciałbym mieć pojedynczą spację między wartością UID / GID a jej nazwą w nawiasach kwadratowych dla każdego pojedynczego elementu (w tym UID i GID w pierwszym wierszu), ale zastrzeżeniem jest to, że w moich rzeczywistych danych mogę mieć grupy zawierające w nazwach nawiasy klamrowe i nie chcę, aby same nazwy były zniekształcone.
-vRS=,
lub-054
może pomóc.Jeśli masz GNU sed, możesz użyć
który dodaje spację przed 4. i kolejnymi otwartymi nawiasami, a następnie zastępuje przecinki.
źródło
international (uk) location
, poprzez wstawienie niechcianej spacji w samej nazwie.s/\([[:digit:]]\+\)(/\1 (/4g
która doda spację tylko wtedy, gdy przed nawiasiem znajdują się cyfry.To, co powiedział @ stéphane-chazelas, jest prawdą, ale zawsze możesz najpierw dodać spację i podzielić na linie w następujący sposób:
Lub w jednym skrypcie sed (bez
-e
):Zwykle używamy „
/
” jako separatora wyszukiwania poleceń, ale akceptuje on także dowolny znak, więc czasami łatwiej jest czytać przy użyciu innych znaków, takich jak „:
”, aby uniknąć kombinacji takich jak „/\
”.źródło