Это происходит из-за того, что выполняемый вами сценарий не имеет доступа к вашему ключу. Это также не должно работать, если вы это сделали:
ssh -A remote1 'rsync -e "ssh remote2 ssh " remote3:/file .'
awk '++n == 2; !NF {n = 0}' < your-file
Или:
sed -n '
n;p
:1
/./{
n;b1
}' < your-file
Вы считаете нулевую строку пустой, что немного усложняет задачу. Если мы проигнорируем это и примем ваше буквальное утверждение "печатать каждую вторую строку после пустой строки", вы можете сделать это следующим образом с ex
:
ex -sc 'g/^$/+2p' -cq filename
-s
: тихий режим (ex
на самом деле для интерактивного редактирования). -c
: указать команду для выполненияg/^$/
: выполнить команду globally на всех пустых строках+2p
: вывести строку на две строки вниз от текущей строкиq
: команда для выходаЧтобы считать строку 0 пустой строкой (но только если строка 1 не является пустой строкой), вам придется потрудиться; вы можете сделать это в ex
, вставив пустую строку перед строкой 1, затем отфильтровав строки 1-2 через uniq
- но в этом случае вам, вероятно, лучше использовать awk
, для ваших целей.
Есть закодированное значение 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
Легко сделать с помощью perl
:
$ perl -n -e 'BEGIN {$count=0};
if (/^\s*$/) {$count=0} else {$count++};
if ($count eq 2) {print}' alexandru.txt
foo2
bar2
spam2
eggs2
Вы можете использовать awk для запоминания последней пустой строки:
awk -v gap=2 'BEGIN { lastline=0 } /^$/ { lastline=NR } NR==lastline+gap { print }' test.txt
Это означает:
lastline
) в ноль. Это соответствует вашему подразумеваемому требованию, чтобы вторая строка печаталась так, как если бы она шла после пустой строки. lastline
в текущую строку. gap
строк после последней пустой строки, напечатайте ее. Вы можете установить gap
в начале на любое число. Обратите внимание, что если между двумя пустыми строками меньше, чем gap
, то первая пустая строка не будет иметь никакого эффекта.
Для печати 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