используя sed
:
sed 's/^[^"]*"\([^"]*\)".*//'
что ищет: начало строки, серия non-кавычки, двойные кавычки, захватывает серия кавычки, двойные кавычки и еще что-нибудь в строке и заменяет его по отснятому материалу.
$ sed 's/^[^"]*"\([^"]*\)".*//' <<'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
, но только с использованием функций, которые работали бы в 7-м издании UNIX™ версии sed
.
кстати, немного более простой способ сделать это с двумя заменителями команды; изменить все до и включая первую двойную кавычку на пустую строку (это последовательность из нуля или более без кавычек, за которой следует двойная кавычка); изменить все после того, что теперь является первой двойной кавычкой, на ничего:
sed 's/^[^"]*"//; s/".*//'
кстати, команда, которую вы пробовали ('sed-n'/"/, /"/p') печатает из одной строки, содержащей двойную кавычку, в следующую строку, содержащую двойную кавычку, без редактирования строк вообще. Именно поэтому это не казалось работа для вас-он сделал то, что вы просили, но то, что вы попросили его сделать, не было тем, что вы намеревались попросить его сделать.
эффективность-мудрый, вряд ли будет измеримая разница в производительности. С точки зрения простоты обслуживания, я подозреваю, что последний меньше нагружает клетки мозга.