Только кошка от определенной строки X (с шаблоном) к другой определенной строке Y (с шаблоном)

Я закончил тем, что понял это следующим методом. IP, который Вы собираетесь дать eth1, должен быть очень похож на IP, автоприсвоенный VirtualBox второму адаптеру, который был присоединен. Видеть, что этот IP переходит к Файлу> Предпочтение> Сеть> Редактирование (Сетевые Детали Только для хоста). Здесь Вы будете видеть IP, который был автоприсвоен Хосту к второму адаптеру. Вы будете использовать этот IP, изменяющий последний октет, чтобы отличаться, например.10 вместо.1

3
13.04.2017, 15:36
4 ответа
sed -n '/foo/,/goo/p;/goo/q' <bigfile

Это бы напечатало только эти строки. Если бы вам нужны были номера строк, вы бы добавили =.

sed -n '/foo/=;/goo/=;//q' <bigfile

q важен, потому что он quits вход при вызове - иначе sed продолжит чтение профиля до конца.

Если вы не хотите печатать строки foo/goo, вы можете сделать вместо этого:

С помощью GNU sed:

sed -n '/foo/,/goo/!d;//!p;/goo/q
' <<\DATA
line1
foo 
line3
line4
line5
goo 
line7
DATA

OUTPUT

line3
line4
line5

И с любым другим:

sed -n '/foo/G;/\n/,/goo/!d;//q;/\n/!p 
' <<\DATA
line1
foo 
line3
line4
line5
goo 
line7
DATA    

OUTPUT

line3
line4
line5

В любом случае, это также завершает свой ввод, как только встречает последнюю строку в вашем поиске.

9
27.01.2020, 21:07

Если вы не против отказаться от текущего подхода к использованию чего-либо в подоболочках для получения номеров строк и разрешить другую утилиту для печати файла, это можно сделать в чистом виде awk с небольшой сложностью:

Если вы хотите вывести строки между foo: и goo: , а не сами строки, тогда вы можете использовать следующее (подобранное отсюда первоначально):

awk '/goo:/ { exit }; flag; /foo:/ { flag = 1 }' bigFile

Вышеуказанный выходс, когда он увидит концевой символ (goo: ), распечатываютs, если флаг истинен, и устанавливают флаг в истинное значение (1, на самом деле), когда он достигает открывающего маркера (foo:).

Если, однако, Вы предпочитаете включать маркерные строки в вывод, команда на самом деле еще проще, так как @jasonwryan mentioned:

awk '/foo:/,/goo:/' bigFile

Если Вы чертовски склонны получать только номера строк и на самом деле не распечатывать файл с помощью одной и той же утилиты, то Вы можете получить номера строк маркеров начала и конца, как показано на рисунке:

awk '/foo:|goo:/ { print NR }' bigFile
5
27.01.2020, 21:07

Альтернатива sed одна:

sed '/foo/,$!d;/goo/q'
4
27.01.2020, 21:07

Для замены констант выражениями можно использовать подстановку команд .

Для подстановки вывода команды в выражение используйте $(command)

В этом случае в соответствующую командную строку будет выведено:

tail -n+$(grep -nr "foo:" bigfile | cut -d':' -f1) bigfile | \
head -n$(($(grep -nr "goo:" bigfile | cut -d':' -f1)-$(grep -nr "foo:" bigfile | cut -d':' -f1)+1))

Это приведет к выводу всех строк из строки, содержащей foo:, в строку, содержащую goo:, включительно.

1
27.01.2020, 21:07

Теги

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