Я думаю, что вы ищете, sed
... это сек Tream ред itor, который позволит вам сделать замены на основе линии построчно.
Как вы объясните, команда `cat named.local | Grep зона»дает выход немного, как это:
zone "domain1.tld" {
zone "domain2.tld" {
zone "domain3.tld" {
zone "domain4.tld" {
Я предполагаю, что вы хотите, чтобы вывод, что-то вроде этого, так как вы сказали, что вам нужно в двойные кавычки:
"domain1.tld"
"domain2.tld"
"domain3.tld"
"domain4.tld"
Итак, в действительности, из каждой строки мы просто хотим получить текст между двойными кавычками (включая сами двойные кавычки).
Я не уверен, что вы знакомы с Regular Expressions, но они являются бесценным инструментом для любого человека, пишущего сценарии оболочки. Например, регулярное выражение /.o.e/
будет соответствовать любой строке, где есть слово со второй буквой, это нижний регистр o
, а четвертый - 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/
слева направо:
На простом английском языке:. «Прочитайте всю строку, копируя в стороне текста между двойными кавычками Затем замените всю строку с содержимым между двойным qoutes."
Вы даже можете добавить двойные кавычки вокруг замещающего текста s/^.*"(.*)".*$/"\1"/
, так что мы получим:
"The Kid"
"The Fish"
"The Man"
И что может быть использовано sed
заменить строку с содержимым из в кавычки:
sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
(Это просто оболочка маскирования, чтобы иметь дело с двойными кавычками и косой чертой и прочим.)
Таким образом, вся команда горя ÜLD быть что-то вроде:
cat named.local | grep zone | sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
Yup, я использую его прямо сейчас, но я думаю, что должен быть более простой способ сделать это, потому что теперь я использую sed -e 's/zone "// g' | sed -e 's /" { // g ', чтобы удалить начало и конец файла, а не просто совместить середину. – jpou
Бритье от начала и конца вполне приемлемо. Это не соревнование - если это сработает, все в порядке. Если вы хотите сделать это, сопоставляя текст в кавычках, взгляните на «группы захвата». – zoul
ugh. Я слишком долго набирал это, и это все еще не сделано ... Кажется, меня всех избили. Но я рад, что вы уже поняли это :-) – scraimer