Первая проблема, которую я здесь заметил, заключается в том, что вы не реализовали метод офисы () в производных классах. Вы должны это сделать, иначе вы получите ошибку.
Кроме того, вы не можете иметь класс внутри класса в 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();
}
}
К сожалению, вы не можете избавиться от этих пробелов, по крайней мере, нет на любом устройстве, которое я попробовал. Это действительно очень раздражает. Это часть спецификации, что вы не можете передавать аудио или видео по 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\"/"
Ну, еще никто не упомянул cut
, поэтому, чтобы доказать, что есть много способов сделать что-то с оболочкой:
% grep '^zone' /etc/bind/named.conf | cut -d' ' -f2
"gennic.net"
"generic-nic.net"
"dyn.generic-nic.net"
"langtag.net"
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:
.*
"
\(
[^"]*
\)
"
.*
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.
Пока кто-то указывает на 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, например, на общем веб-хосте). Но, если бы я делал это в оболочке, я бы подошел к одному из двух выше.