совпавший текст в кавычках (новичок)

Первая проблема, которую я здесь заметил, заключается в том, что вы не реализовали метод офисы () в производных классах. Вы должны это сделать, иначе вы получите ошибку.

Кроме того, вы не можете иметь класс внутри класса в Java, по крайней мере, не таким образом. Существует концепция внутреннего класса, которую вы можете изучить.

Вот рабочий образец. Совет: используйте пакет, чтобы сохранить все ваши классы вместе.

public abstract class Employee {
    public abstract void names();
    public abstract void offices();
}

public class Shyamoli extends Employee {
    @Override
    public void names(){
        System.out.println("I am at Shyamoli");
    }

    @Override
    public void offices() {
        // do something
    }
}

public class Banani extends Employee {
    @Override
    public void names(){
        System.out.println("I am at Banani.");
    }

    @Override
    public void offices() {
        // do something
    }
}

public class Javatest {
    public static void main(String[] args){
        Employee south = new Banani();
        Employee north = new Shyamoli();
        north.names();
        south.names();
    }
}
5
задан Toon Krijthe 7 September 2012 в 12:37
поделиться

5 ответов

К сожалению, вы не можете избавиться от этих пробелов, по крайней мере, нет на любом устройстве, которое я попробовал. Это действительно очень раздражает. Это часть спецификации, что вы не можете передавать аудио или видео по HTTP. sa 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"

Итак, на самом деле, от каждого Мы просто хотим, чтобы текст был в двойных кавычках (включая сами двойные кавычки).

Я не уверен, что вы знакомы с Регулярными выражениями , но они являются бесценным инструментом для любого человек, пишущий сценарии оболочки. Например, регулярное выражение /. Oe / будет соответствовать любой строке, в которой слово со 2-й буквой является строчным o , а 4-е - e . Это будет соответствовать строке, содержащей слова, такие как « zone », « tone » или даже « Ione-deaf. »

Прикол использовать . (точка) символ означает «любая буква». Есть пара других специальных символов, таких как * , что означает «повторить предыдущий символ 0 или более раз». Таким образом, регулярное выражение типа a * будет соответствовать " a ", " aaaaaaa " или пустой строке: ""

Таким образом, вы можете сопоставить Строка внутри кавычек, использующая: / ". *" /

Есть еще одна вещь, которую вы знаете о sed (и по комментариям, вы уже делаете!) - это позволяет возвращаться назад . Как только вы сказали, как распознать слово, вы можете использовать это слово как часть замены. Например, предположим, что вы хотите превратить этот список:

Billy "The Kid" Smith
Jimmy "The Fish" Stuart
Chuck "The Man" Norris

В этот список:

The Kid
The Fish
The Man

Сначала вы будете искать строку внутри кавычек. Мы уже видели, что это было / ". *" / .

Далее, мы хотим использовать то, что находится внутри кавычек. Мы можем сгруппировать его, используя parens: / "(. *)" /

Если бы мы хотели заменить текст кавычками с подчеркиванием, мы бы сделали замену: 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 / - Запустите подстановка регулярное выражение
  • ^ - поиск начала строки. Начните оттуда.
  • . * - Продолжайте читать, читая каждый символ, пока ...
  • " - ... пока не достигнете двойной кавычки.
  • ( - создать группу символов, которую мы могли бы вспомнить позже при возврате.
  • . * - Продолжайте, читая каждый символ, пока ...
  • ) - (pssst! Закрыть группу!)
  • " - ... пока вы не достигнете двойной кавычки.
  • . * - Продолжайте читать, читая каждый символ , до ...
  • $ - Конец строки!

  • / - используйте то, что после этого, чтобы заменить то, что вы сопоставили

  • \ 1 - вставьте содержимое первая группа (что было в скобках) соответствует.
  • / - конец регулярного выражения

На простом английском языке: «Прочитайте всю строку, копируя текст между двойными кавычками. Затем замените всю строку содержимым между двойными кавычками. "

Вы можете даже добавить двойные кавычки вокруг заменяющего текста s /^.*" (. *) ". * $ /" \ 1 " / , поэтому мы получим:

"The Kid"
"The Fish"
"The Man"

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

sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"

(Это просто экранирование от оболочки, чтобы иметь дело с двойными кавычками, косой чертой и прочим.)

Таким образом, вся команда будет выглядеть примерно так:

cat named.local | grep zone | sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
23
ответ дан 18 December 2019 в 06:12
поделиться

Ну, еще никто не упомянул cut , поэтому, чтобы доказать, что есть много способов сделать что-то с оболочкой:

% grep '^zone' /etc/bind/named.conf  | cut -d' ' -f2
"gennic.net"
"generic-nic.net"
"dyn.generic-nic.net"
"langtag.net"
2
ответ дан 18 December 2019 в 06:12
поделиться

Вы должны взглянуть на awk .

0
ответ дан 18 December 2019 в 06:12
поделиться

1.

zoul@naima:etc$ cat named.conf | grep zone
zone "." IN {
zone "localhost" IN {
    file "localhost.zone";
zone "0.0.127.in-addr.arpa" IN {

2.

zoul@naima:etc$ cat named.conf | grep ^zone
zone "." IN {
zone "localhost" IN {
zone "0.0.127.in-addr.arpa" IN {

3.

zoul@naima:etc$ cat named.conf | grep ^zone | sed 's/.*"\([^"]*\)".*/\1/'
.
localhost
0.0.127.in-addr.arpa

The regexp is .*"\([^"]*\)".*, which matches:

  1. any number of any characters: .*
    • a quote: "
    • starts to remember for later: \(
    • any characters except quote: [^"]*
    • ends group to remember: \)
    • closing quote: "
    • and any number of characters: .*

When calling sed, the syntax is 's/what_to_match/what_to_replace_it_with/'. The single quotes are there to keep your regexp from being expanded by bash. When you “remember” something in the regexp using parens, you can recall it as \1, \2 etc. Fiddle with it for a while.

1
ответ дан 18 December 2019 в 06:12
поделиться

Пока кто-то указывает на sed / awk, я хочу отметить, что grep является избыточным.

sed -ne '/^zone/{s/.*"\([^"]*\)".*/\1/;p}' /etc/bind/named.conf

Это дает вам то, что вы ищете, без кавычек (ход кавычки в скобках, чтобы сохранить их). В awk с кавычками еще проще:

awk '/^zone/{print $2}' /etc/bind/named.conf

Я стараюсь избегать конвейеров как можно больше (но не больше). Помните, Не трубите кошку . Это не нужно. И, так как awk и sed дублируют работу grep, также не используйте grep. По крайней мере, не в sed или awk.

Лично я, вероятно, использовал бы perl. Но это потому, что я, вероятно, сделал бы все остальное, что вы делаете в Perl, сделав это незначительной деталью (и имея возможность вбросить весь файл внутрь и одновременно выполнить регулярные выражения со всем, игнорируя \ n ' s будет бонусом в случаях, когда я не контролирую / etc / bind, например, на общем веб-хосте). Но, если бы я делал это в оболочке, я бы подошел к одному из двух выше.

0
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: