Używanie sed
:
sed 's/^[^"]*"\([^"]*\)".*/\1/'
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.
$ sed 's/^[^"]*"\([^"]*\)".*/\1/' <<'EOF'
> 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)
> EOF
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
$
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:
sed 's/^[^"]*"//; s/".*//'
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.