Предыдущие два варианта хороши. Можно также использовать -v
или -vv
аргументы.
$ ssh -vv eric@myserver
Sed соответствует всем строкам, но не включает новую строку, таким образом, пустая строка просто будет пустой строкой. Можно использовать ^
соответствовать началу строки и $
соответствовать концу, таким образом, ^$
соответствует пустой строке. Просто замена это с % ghi\n%
:
sed 's/^$/% ghi\n%/'
Новая строка, которая уже существовала, останется, таким образом, Вы закончите с % ghi
на одной строке и %
на следующем
Править: Если это должно только соответствовать однажды затем, выражение немного более сложно. Самым легким путем я знаю для выполнения в нем sed
:
sed '0,/^$/ s/^$/% ghi\n%/'
Замена перенесена в диапазон адресов 0,/^$/
, что означает, "только применяют следующее к строкам между 0 и первой строке, которая соответствует ^$
". Так как выражение замены проверяет на ^$
также, единственная строка, которую это на самом деле собирается изменить, является первой, который соответствует ^$
- первая пустая строка
NB: Это отвечает на исходный вопрос, который попросил:
Как я заменяю единственную пустую строку двумя строками содержания?
Это не отвечает на вопрос 'хамелеона'.
sed '/^$/{i\
% ghi\
%
d
}'
Когда sed
находит пустую строку, это вставляет эти две строки'% ghi
'и'%
', затем удаляет пустую строку.
Из комментариев
Это производит синтаксическую ошибку.
Используйте реальную оболочку вместо морской ракушки; это сохранит всех горе в конечном счете. Поместите команды в 5 строк простого файла и использования sed -f sed.script
. Существуют, вероятно, другие способы достигнуть этого в оболочке C - это работает, хотя:
echo '/^$/{\' > sed.script
echo '% ghi\' >> sed.script
echo '%' >> sed.script
echo 'd' >> sed.script
echo '}' >> sed.script
sed -f sed.script data.file
rm -f sed.script
csh
и после Вашего комментария я переключусь на sh
для моего сценария, пишущий потребности. Спасибо за откровенную обратную связь.
– Peter Grill
24.05.2011, 21:21
i
nsert так или иначе, почему не просто c
hange?
– mikeserv
30.10.2015, 22:03
Вот другой способ с sed
, который заменяет только первую пустую строку без использования \n
в RHS или расширения gnu sed
0 address:
sed '/^$/{ # if line is empty
x # exchange pattern space w. hold space
//{ # if pattern space is empty (means the hold buffer was empty)
s//%/ # replace it with a % character
h # overwrite hold space (so now hold space looks like this: ^%$)
s/$/ ghi/ # add a space and the string ghi after the %, then
G # append content of hold buffer to pattern space so now the
} # pattern space looks like this: ^% ghi\n%$
//!x # if pattern space is not empty it means a change was
} # already made so exchange back (do nothing)
' infile
one liner:
sed -e'/^$/{x;//{s//%/;h;s/$/ ghi/;G' -e'}' -e'//!x' -e'}' infile
Хотя на самом деле, это кусок пирога для ed
:
ed -s infile <<< $'/^$/s//% ghi\\\n%/\n,p\nq'
замените ,p
на w
для редактирования файла на месте.
sed -e1\!b -e:n -e"/^$/c$(printf '\\\n%%%s' \ ghi '')" -en\;bn
sed
понимает три примитива для записи сценариев с фиксированной строкой в стандартный вывод.Все три начинаются после следующей за ним новой строки с экранированной обратной косой чертой в сценарии и заканчиваются либо первой неэкранированной новой строкой в сценарии, либо первым встречающимся концом файла в сценарии:
i
i
n вставляет фиксированную строку в стандартный вывод прямо сейчас a
a
ppend в stdout в порядке появления сценария перед следующим циклом строки , или, для последней строки, в конце этой c
(1 (, 2)?)?
, заканчивает текущий цикл строки, и c
изменяет вывод на фиксированную строку для последнего из любого адреса [es] printf '\n\n\n\n\n' |
sed -e1\!b -e:n \
-e"/^$/c$(printf '\\\n%%%s' \ ghi '')" \
-en\;bn
% ghi %
Таким образом, этот сценарий b
выходит из сценария для каждой строки что есть !
не 1
st, но от первой строки до тех пор, пока она не сможет c
изменить пустую строку на фиксированную строку, он автоматически печатает каждую непустую строку перед перезаписью это с n
ext и возвращение к метке : n
ext, чтобы перейти снова.
sed '3 i ghi'
(для вставки топленого масла выше строки 3) – Michael Mrozek♦ 24.05.2011, 17:01\n
в тексте замены и отсутствии разделителя команды прежде}
не являются стандартными. – Gilles 'SO- stop being evil' 24.05.2011, 22:23