Использование sed получить подстроку между двумя двойными кавычками

у меня файл

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)

Теперь я хочу извлечь только пути к файлам и сохранить его в другой файл. Выходной файл выглядит так:

/home/path/to/file 
/home/path/to/file1 
/home/path/to/file2
/home/path/to/file3

С помощью sed или awk, как я могу это сделать?

Я пробовал sed -n '/"/,/"/p' myfile но он не работает.

27
задан XemX
27.04.2023 21:51 Количество просмотров материала 2644
Распечатать страницу

4 ответа

вы можете передать stderr вашей команды rsync в скрипт awk:

awk -F '"' '{print }' 

или вырезать такой:

cut -d'"' -f2
16
отвечен anubhava 2023-04-29 05:39

используя 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') печатает из одной строки, содержащей двойную кавычку, в следующую строку, содержащую двойную кавычку, без редактирования строк вообще. Именно поэтому это не казалось работа для вас-он сделал то, что вы просили, но то, что вы попросили его сделать, не было тем, что вы намеревались попросить его сделать.

эффективность-мудрый, вряд ли будет измеримая разница в производительности. С точки зрения простоты обслуживания, я подозреваю, что последний меньше нагружает клетки мозга.

6
отвечен Jonathan Leffler 2023-04-29 07:56

если ваша версия grep поддерживает Perl-regexp:

grep -oP '(?<=")/home/.*?(?=")' file >> anotherfile

результаты:

/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3

вы также можете сделать это менее строгим, чтобы соответствовать чему-либо между удваивается, если вы хотите:

grep -oP '(?<=")[^"]*' file >> anotherfile
0
отвечен Steve 2023-04-29 10:13

использовать оператор>>, чтобы сохранить вывод в файл.

Как

grep -r "pattern" * >> file.txt

Так что просто измените это для вашего конкретного сценария, используя sed, добавив

>> filename

команда

-1
отвечен AStupidNoob 2023-04-29 12:30

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх