Використання sed
:
sed 's/^[^"]*"\([^"]*\)".*/\1/'
Це шукає: початок рядка, серія нецитат, подвійна цитата, фіксує серію нецитат, подвійну цитату та все інше у рядку, і замінює її відзнятим матеріалом.
$ 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
$
Тестуйте на RHEL 5 Linux з GNU sed
, але лише використовуючи функції, які працювали б у версії UNIX ™ 7-го видання sed
.
До речі, дещо простіший спосіб зробити це за допомогою двох команд-замінників; змінити все до і включити першу подвійну цитату на порожню рядок (це послідовність нульових або більше не цитат, а потім подвійна цитата); змінити все після того, що є першою подвійною цитатою ні до чого:
sed 's/^[^"]*"//; s/".*//'
До речі, команда, яку ви спробували (`sed -n '/" /, / "/ p') друкує з одного рядка, що містить подвійну лапочку, до наступного рядка, що містить подвійну лапочку, без редагування рядків взагалі. Ось чому це, здається, не працювало для вас - це робило те, про що ви просили, але те, що ви просили, це не те, що ви мали намір просити.
Що стосується ефективності, то навряд чи буде помітна різниця у продуктивності. З точки зору простоти обслуговування, я підозрюю, що останній менше оподатковує клітини мозку.