Mam plik
xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
"/home/path/to/file1": Permission denied (13) rsync:
"/home/path/to/file2": Permission denied (13) rsync:
"/home/path/to/file3": Permission denied (13)
Teraz chcę wyodrębnić tylko ścieżki plików i zapisać je w innym pliku. Plik wyjściowy jest jak:
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
Używając sed lub awk, jak mogę to zrobić?
Próbowałem, sed -n '/"/,/"/p' myfile
ale to nie działa.
Odpowiedzi:
Możesz potokować stderr polecenia rsync do skryptu awk:
Lub do polecenia cięcia takiego:
źródło
cut -d\" -f2
"
i"
na stderr.$1
; wszystko między pierwszym a drugim podwójnym cudzysłowem jest$2
; i wszystko po drugim podwójnym cytacie jest w$3
($4
, ...). Nazwa pliku jest (najwyraźniej) zawsze pomiędzy dwoma pierwszymi podwójnymi cudzysłowami, więc to rozwiązanie powinno działać (i działało, kiedy go testowałem).Używanie
sed
:To szuka: początku linii, szeregu niekwotowań, podwójnego cytatu, przechwytuje szereg niekwotowań, podwójnego cytatu i wszystkiego innego w linii i zastępuje go przechwyconym materiałem.
Przetestuj na RHEL 5 Linux z GNU
sed
, ale tylko przy użyciu funkcji, które działałyby w 7. edycji UNIX ™sed
.Nawiasem mówiąc, nieco prostszym sposobem na to jest użycie dwóch poleceń zastępczych; zmień wszystko do pierwszego podwójnego cudzysłowu włącznie z pustym ciągiem (jest to sekwencja zero lub więcej niekwotowań, po których następuje podwójny cudzysłów); zmień wszystko po tym, co jest teraz pierwszym podwójnym cytatem na nic:
Nawiasem mówiąc, wypróbowane polecenie (`sed -n '/" /, / "/ p') drukuje od jednego wiersza zawierającego podwójny cudzysłów do następnego wiersza zawierającego podwójny cudzysłów, bez edytowania wierszy. Dlatego wydawało się, że to nie działa dla ciebie - zrobiło to, o co prosiłeś, ale to, o co prosiłeś, nie było tym, o co chciałeś poprosić.
Jeśli chodzi o efektywność, nie będzie prawdopodobnie mierzalnej różnicy w wydajności. Pod względem łatwości konserwacji podejrzewam, że ta ostatnia jest mniej obciążająca komórki mózgowe.
źródło
Jeśli Twoja wersja
grep
obsługuje Perl-regexp:Wyniki:
Możesz także uczynić to mniej surowym, aby dopasować cokolwiek między podwójnymi, jeśli chcesz:
źródło
.*
niechęci,.*?
na wypadek, gdyby w dalszej kolejności pojawiła się dodatkowa podwójna wycena? Lub użyj[^"]*
zamiast.*
?Użyj operatora >>, aby zapisać dane wyjściowe w pliku.
Lubić
Więc po prostu zmień to w swoim konkretnym scenariuszu, używając sed, dołączając
do polecenia
źródło
grep -r
Robi rekurencyjne przeszukiwanie za pośrednictwem dowolnego katalogach wymienionych w argumentach (*
). Nie jest jasne, jaki wzór masz na myśli, alegrep
przejmie całą linię. Celem ćwiczenia jest zebranie informacji z części linii. Jeśli używasz GNUgrep
, są na to sposoby (-o
); są to niestandardowe (z wyjątkiem zakresu, w którym GNU definiuje de facto standard). Podobnie z użyciem wyrażeń regularnych PCRE; są to kolejne rozszerzenia GNU. Są w porządku, jeśli masz GNUgrep
i nie planujesz pracy na platformach, na których GNUgrep
nie jest domyślnie dostępne.