Как напечатать n-ю строку после совпадения / пустых строк

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

ssh -A remote1 'rsync -e "ssh remote2 ssh " remote3:/file .'
1
26.03.2016, 00:16
6 ответов
awk '++n == 2; !NF {n = 0}' < your-file

Или:

sed -n '
  n;p
  :1
  /./{
    n;b1
  }' < your-file
8
27.01.2020, 23:11

Вы считаете нулевую строку пустой, что немного усложняет задачу. Если мы проигнорируем это и примем ваше буквальное утверждение "печатать каждую вторую строку после пустой строки", вы можете сделать это следующим образом с ex:

ex -sc 'g/^$/+2p' -cq filename
  • -s: тихий режим (ex на самом деле для интерактивного редактирования).
  • -c: указать команду для выполнения
  • g/^$/: выполнить команду globally на всех пустых строках
  • +2p: вывести строку на две строки вниз от текущей строки
  • q: команда для выхода

Чтобы считать строку 0 пустой строкой (но только если строка 1 не является пустой строкой), вам придется потрудиться; вы можете сделать это в ex, вставив пустую строку перед строкой 1, затем отфильтровав строки 1-2 через uniq- но в этом случае вам, вероятно, лучше использовать awk, для ваших целей.

1
27.01.2020, 23:11

Есть закодированное значение 2 для печати каждой второй строки после пустой.

Попробуйте:

awk 'BEGIN { empty=1; n=0; } { if ($0 ~ /^$/) { empty=1; n=0; } else if (empty) { n++; if (n==2) { empty=0; print; } } }' file.txt

file.txt - имя файла для разбора в текущем каталоге.

Предполагается, что после каждой пустой строки всегда есть n строк или больше, при поиске n-ой строки, верно?

Тестовый вывод ниже:

awk 'BEGIN { empty=1; n=0; } { if ($0 ~ /^$/) { empty=1; n=0; } else if (empty) { n++; if (n==2) { empty=0; print; } } }' file.txt
foo2
bar2
spam2
eggs2

----

Есть известная страница: Sed - An Introduction and Tutorial by Bruce Barnett

Попробуйте эту версию ниже, которая очень близка к вашей:

sed -n '{
2 {
p
}
/^$/ {n
n
p}}' file.txt

foo2
bar2
spam2
eggs2
0
27.01.2020, 23:11

Легко сделать с помощью perl:

$ perl -n -e 'BEGIN {$count=0}; 
              if (/^\s*$/) {$count=0} else {$count++};
              if ($count eq 2) {print}' alexandru.txt 
foo2
bar2
spam2
eggs2
1
27.01.2020, 23:11

Вы можете использовать awk для запоминания последней пустой строки:

awk -v gap=2 'BEGIN { lastline=0 } /^$/ { lastline=NR } NR==lastline+gap { print }' test.txt

Это означает:

  • В начале, установите переменную, которая указывает, какой была последняя строка (lastline) в ноль. Это соответствует вашему подразумеваемому требованию, чтобы вторая строка печаталась так, как если бы она шла после пустой строки.
  • Находясь в пустой строке, установите lastline в текущую строку.
  • Когда номер текущей строки составляет gap строк после последней пустой строки, напечатайте ее.

Вы можете установить gap в начале на любое число. Обратите внимание, что если между двумя пустыми строками меньше, чем gap, то первая пустая строка не будет иметь никакого эффекта.

0
27.01.2020, 23:11

Для печати lnbй строки после первого пробела (пустой )строки...

Номер строки для печати:

lnb=2

С СЭД:

sed -ne '/^\s*$/{:a;n;0~'"$lnb"'!ba;p;q}' my_file

С перлом:

perl -ne '/^\s+$/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,last)' my_file
0
27.01.2020, 23:11

Теги

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