sed управляют для замены пустой строки двумя строками содержания

Предыдущие два варианта хороши. Можно также использовать -v или -vv аргументы.

$ ssh -vv eric@myserver
4
13.04.2017, 15:37
4 ответа

Sed соответствует всем строкам, но не включает новую строку, таким образом, пустая строка просто будет пустой строкой. Можно использовать ^ соответствовать началу строки и $ соответствовать концу, таким образом, ^$ соответствует пустой строке. Просто замена это с % ghi\n%:

sed 's/^$/% ghi\n%/'

Новая строка, которая уже существовала, останется, таким образом, Вы закончите с % ghi на одной строке и % на следующем


Править: Если это должно только соответствовать однажды затем, выражение немного более сложно. Самым легким путем я знаю для выполнения в нем sed :

sed '0,/^$/ s/^$/% ghi\n%/'

Замена перенесена в диапазон адресов 0,/^$/, что означает, "только применяют следующее к строкам между 0 и первой строке, которая соответствует ^$". Так как выражение замены проверяет на ^$ также, единственная строка, которую это на самом деле собирается изменить, является первой, который соответствует ^$ - первая пустая строка

3
27.01.2020, 20:49
  • 1
    Это работает отлично, но я забыл упоминать, что я ТОЛЬКО хочу, чтобы это заменило первую пустую строку. Я должен смочь добавить "1" где-нибудь в конце, bu везде я пробую, я, кажется, получаю ошибку. –  Peter Grill 24.05.2011, 08:52
  • 2
    я получаю синтаксическую ошибку "плохо, отмечает в команде замены: '}'" на Mac, работающем 10.6.7? –  Peter Grill 24.05.2011, 09:16
  • 3
    Если я знаю номер строки, который я делаю, я могу затем использовать следующее: $ s/^ / топленое масло % \\\n % /' Только оставленная проблема состоит в том, что это \n разоблачает два символа "\" и "n" около конца строки в противоположность вставке возврата каретки. –  Peter Grill 24.05.2011, 09:44
  • 4
    @Peter Является версией Mac отличающегося sed? Я ничего действительно не знаю о макинтошах. Если Вы знаете номер строки, это - путь, легче хотя: sed '3 i ghi' (для вставки топленого масла выше строки 3) –  Michael Mrozek♦ 24.05.2011, 17:01
  • 5
    Использование \n в тексте замены и отсутствии разделителя команды прежде } не являются стандартными. –  Gilles 'SO- stop being evil' 24.05.2011, 22:23

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
2
27.01.2020, 20:49
  • 1
    Это также производит ошибку синтаксиса, даже если я пытаюсь поместить ее на одну строку. –  Peter Grill 24.05.2011, 09:45
  • 2
    я видел довольно много сообщений об отказывании csh и после Вашего комментария я переключусь на sh для моего сценария, пишущий потребности. Спасибо за откровенную обратную связь. –  Peter Grill 24.05.2011, 21:21
  • 3
    @Peter: категорический снос оболочки C для программирования является Программированием Csh, Продуманным Вредный. Я думаю, что Вы просто приняли корректное решение. –  Jonathan Leffler 24.05.2011, 21:24
  • 4
    это вставляет строку для каждой пустой строки в файле. и если Вы используете insert так или иначе, почему не просто change? –  mikeserv 30.10.2015, 22:03
  • 5
    @mikeserv: вопрос был изменен существенно долгое время (несколько часов) после того, как я в последний раз отредактировал этот ответ. Вопросы о хамелеоне оставляют действительные ответы для исходного вопроса, выглядящего недопустимыми для пересмотренного вопроса. –  Jonathan Leffler 30.10.2015, 22:09

Вот другой способ с 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 для редактирования файла на месте.

3
27.01.2020, 20:49
sed -e1\!b -e:n -e"/^$/c$(printf '\\\n%%%s' \ ghi '')" -en\;bn

sed понимает три примитива для записи сценариев с фиксированной строкой в стандартный вывод.Все три начинаются после следующей за ним новой строки с экранированной обратной косой чертой в сценарии и заканчиваются либо первой неэкранированной новой строкой в ​​сценарии, либо первым встречающимся концом файла в сценарии:

  • i

    • i n вставляет фиксированную строку в стандартный вывод прямо сейчас
  • a

    • планирует фиксированную строку для a ppend в stdout в порядке появления сценария перед следующим циклом строки , или, для последней строки, в конце этой
  • c

    • удаляет пространство шаблонов для всего адреса [es] (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, чтобы перейти снова.

1
27.01.2020, 20:49

Теги

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