Регулярное выражение, чтобы извлечь все в кавычках в оболочке bash?

#regex #bash #shell #sed

#регулярное выражение #bash #оболочка #sed

Вопрос:

Рассмотрим этот файл данных

случайный текст «txt» случайный текст
случайный текст «txt1» случайный текст «txt2»
случайный текст «txt1» случайный текст «txt3»
случайный текст «txt1» случайный текст «txt4»
случайный текст «txt1» случайный текст «txt5»
случайный текст «txt1» случайный текст «txt5» случайный текст «txt6» случайный текст

Для каждой из этих строк мне нужно извлечь все внутри кавычек, Т.Е.

txt
txt1, txt2
, txt1, txt3,
txt1, txt4
, txt1, txt5
, txt1, txt5, txt6
В одной строке может быть несколько кавычек.

Я написал это регулярное выражение в оболочке (на самом деле я написал команду sed, но когда я вставляю ее сюда, она портит .*)

^DotStar»[^»] «DotStar $ (для кавычек с одним числом)
^DotStar»[^»] «DotStar»[^»] «DotStar $ (если есть две кавычки)

Как вы можете видеть, мое регулярное выражение зависит от количества появляющихся кавычек. Кто-нибудь может дать мне общий reg-ex, который, независимо от того, сколько раз появляются кавычки, выдает мне текст.

Ответ №1:

Вы можете использовать эту sed команду:

 sed --posix 's/[^"]*"([^"]*)"[^"]*/1,/g;s/(.*),/1/' input.txt
  

Вывод:

 txt
txt1,txt2
txt1,txt3
txt1,txt4
txt1,txt5
txt1,txt5,txt6
  

Комментарии:

1. Я думаю, у вас может быть небольшая ошибка: у меня это работает, но основано на вашем, что очень умно: sed 's/[^"]*"([^"]*)"/1,/g;s/(.*),.*/1/'

2. В чем преимущество этого?

3. Я немного сузил круг поиска. У меня ваше не работает, но это работает, если вы измените на *

4. Хммм. Какую версию sed вы используете?

5. похоже на bsd sed, который поставляется с моим Mac. Вероятно, в этом разница.