Я думаю, что вы ищете sed
... это s tream ed итор, который позволит вам делать замены построчно .
Как вы объясняете, команда `cat named.local | grep zone 'дает вам вывод, похожий на этот:
zone "domain1.tld" {
zone "domain2.tld" {
zone "domain3.tld" {
zone "domain4.tld" {
Я предполагаю, что вы хотите, чтобы вывод был примерно таким, поскольку вы сказали, что вам нужен текст в двойных кавычках:
"domain1.tld"
"domain2.tld"
"domain3.tld"
"domain4.tld"
Итак, на самом деле, из каждой строки мы просто хотим, чтобы текст был заключен в двойные кавычки (включая сами двойные кавычки).
Я не уверен, что вы знакомы с Регулярными выражениями , но они являются бесценным инструментом для любого человека, пишущего сценарии оболочки. Например, регулярное выражение /.o.e/
будет соответствовать любой строке, где есть слово, где 2-я буква была в нижнем регистре o
, а 4-я была e
. Это будет соответствовать строке, содержащей такие слова, как "zone
", "tone
" или даже "I am tone-deaf.
"
Хитрость заключалась в том, чтобы использовать символ .
(точка) для обозначения «любой буквы». Есть пара других специальных символов, таких как *
, что означает «повторить предыдущий символ 0 или более раз». Таким образом, регулярное выражение типа a*
будет соответствовать "a
", "aaaaaaa
" или пустой строке: ""
Таким образом, вы можете сопоставить строку внутри кавычек, используя: /".*"/
Есть еще одна вещь, которую вы знаете о sed
(и по комментариям, вы уже делаете!) - она позволяет возврат . Как только вы скажете ему, как распознать слово, вы можете использовать его как часть замены. Например, предположим, что вы хотите включить этот список:
Billy "The Kid" Smith
Jimmy "The Fish" Stuart
Chuck "The Man" Norris
В этот список:
The Kid
The Fish
The Man
Сначала вы искали строку внутри кавычек. Мы уже видели это, это было /".*"/
.
Далее мы хотим использовать то, что находится внутри кавычек. Мы можем сгруппировать с помощью паренов: /"(.*)"/
Если бы мы хотели заменить текст на кавычки подчеркиванием, мы бы сделали замену: s/"(.*)"/_/
, и это оставило бы:
Billy _ Smith
Jimmy _ Stuart
Chuck _ Norris
Но у нас есть возвращение! Это позволит нам вспомнить, что было внутри паренов, используя символ \1
. Так что если мы сделаем сейчас: s/"(.*)"/\1/
мы получим:
Billy The Kid Smith
Jimmy The Fish Stuart
Chuck The Man Norris
Поскольку кавычек не было в скобках, они не были частью содержимого \1
!
Чтобы оставить только содержимое в двойных кавычках, нам нужно сопоставить всю строку. Для этого у нас есть ^
(что означает «начало строки») и $
(что означает «конец строки».)
Так что теперь, если мы используем s/^.*"(.*)".*$/\1/
, мы получим:
The Kid
The Fish
The Man
Почему? Давайте прочитаем регулярное выражение s/^.*"(.*)".*$/\1/
слева направо:
Проще говоря: «Прочитайте всю строку, скопировав текст между двойными кавычками. Затем замените всю строку содержимым между двойными кавычками».
Вы можете даже добавить двойные кавычки вокруг заменяющего текста s/^.*"(.*)".*$/"\1"/
, так что мы получим:
"The Kid"
"The Fish"
"The Man"
И это может быть использовано sed
для замены строки содержимым из кавычек:
sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
(Это просто экранирование, чтобы иметь дело с двойными кавычками, косой чертой и прочим.)
Так что вся команда будет выглядеть примерно так:
cat named.local | grep zone | sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"