У меня есть файл из 20 строк. Я хочу найти строку между строками 10 и 15 и распечатать строку вместе с номерами строк исходного файла.
я пытался sed -n 10,15p file | grep -n "pattern"
Проблема с вышеприведенной командой состоит в том, что строка вывода с номером 10 sed
будет строкой с номером 1 для grep
.
Следовательно, он не печатает номера строк из исходного файла.
sed '10,15!d;/pattern/!d;='
Ответы:
Когда я работаю с
sed
женой, мне легче всего сузить круг возможных результатов. Вот почему я иногда опираюсь на!
оператор отрицания. Очень часто проще отсеять неинтересный вклад, чем демонстративно выбрать интересный вид - по крайней мере, это мое мнение по этому вопросу.Я нахожу этот метод более встроенным в
sed
поведение по умолчанию, которое заключается в автоматической печати пространства шаблонов в конце сценария. Для простых вещей, таких как это, это также может легко привести к созданию надежного сценария - сценария, который не зависит от синтаксических расширений определенных реализаций для работы (как это обычно наблюдаетсяsed
{functions}
) .Вот почему я рекомендовал вам сделать:
... которая сначала обрезает любую линию, находящуюся вне диапазона строк 10 и 15, и из числа тех, которые остаются, обрезает любую линию, которая не соответствует
pattern
. Если вы обнаружите, что предпочли бы, чтобы номер строкиsed
печатался на той же строке, что и совпадающая строка, я бы, вероятно, посмотрелpaste
в этом случае. Может быть...... который будет чередовать замену входных электронных
\n
линий:
символом или другой электронной\n
строкой.Например:
... печать ...
источник
Вот
awk
решение:Если мы должны использовать только
sed
, то подумайте:=
Команда sed будет печатать только номер строки в отдельной строке. Второй примерsed
выше используется для объединения каждых двух строк, так что номер строки появляется непосредственно перед ее строкой.источник
Использование
nl
:источник
nl
вы можете использоватьcat -n
для получения нумерации строк, но эта опция доступна не во всех версияхcat
; Я предполагаю, что это расширение GNU.nl
как POSIX.sed
это не так. Вам нужен\n
ewline перед любым}
. В большинстве случаев...' -e \}
будет делать вместо. Единственный случай, который я обнаружил, в котором я не могу полагаться на это, - это электронная\n
линия в правой частиs///
тела. Я задал вопрос об этом однажды , но кроме полезных советов, я узнал, как справиться с этим с помощью проб и ошибок.