Это может быть правдой, что:
полностью согласуется с обоими вышеперечисленными функциями и по-прежнему делает еще одну точку:
Другие ответы или, по крайней мере, некоторые из них либо делают точки 1 и 2, но не 3, либо делают точки 3 и нижние точки 1 и 2. Но все три являются истинными.
Возможно, что переключение лошадей в середине потока здесь потребует значительного поломки и что может возникнуть больше проблем, связанных с изменением Python, чтобы интуитивно обработать открывающий фрагмент Стефано. И это может быть правдой, что кто-то, кто хорошо знал внутренности Python, мог объяснить минные поля последствий. Однако
Существующее поведение не является Pythonic, а Python успешным, потому что очень мало о языке нарушает принцип наименьшего удивления где-нибудь возле , это плохо , Это настоящая проблема, было бы разумно ее искоренить. Это дефект дизайна. Если вы понимаете язык намного лучше, пытаясь проследить поведение, я могу сказать, что C ++ делает все это и многое другое; вы многому научитесь, перейдя, например, на тонкие ошибки указателя. Но это не Pythonic: людям, которые заботятся о Python достаточно, чтобы упорствовать перед лицом этого поведения, являются люди, которые тянутся к этому языку, потому что у Python гораздо меньше сюрпризов, чем на другом языке. Dabblers и любопытные становятся Pythonistas, когда они удивляются тому, как мало времени требуется, чтобы получить что-то работающее - не из-за дизайна fl - я имею в виду, скрытая логическая головоломка - которая урезает интуицию программистов, которые тянутся к Python потому что он просто работает.
sed
- инструмент на основе строк. Я не думаю, что это вариант. Вы можете использовать h/H
(hold), g/G
(get).
$ echo -e 'one\ntwo\nthree' | sed -n '1h;1!H;${g;s/one.*two/one/p}'
one
three
Возможно, вам стоит попробовать vim
:%s/one\_.*two/one/g
Как насчет двух вызовов sed: (сначала избавитесь от «двух», затем избавьтесь от пустой строки)
$ echo -e 'one\ntwo\nthree' | sed 's/two//' | sed '/^$/d'
one
three
На самом деле, я предпочитаю Perl для однострочных над Python:
$ echo -e 'one\ntwo\nthree' | perl -pe 's/two\n//'
one
three
Вы можете использовать python следующим образом:
$ echo -e "one\ntwo\nthree" | python -c 'import re, sys; s=sys.stdin.read(); s=re.sub("(?s)one.*two", "one", s); print s,'
one
three
$
Это считывает стандартный входной сигнал python (sys.stdin.read()
), затем заменяет «один» на «один.» два »на dot соответствует всем установленным параметрам (используя (?s)
в начале регулярного выражения), а затем печатает измененную строку (конечная запятая в печати используется, чтобы предотвратить добавление новой строки новой строки).
Это может сработать для вас:
<<<$'one\ntwo\nthree' sed '/two/d'
или
<<<$'one\ntwo\nthree' sed '2d'
или
<<<$'one\ntwo\nthree' sed 'n;d'
или
<<<$'one\ntwo\nthree' sed 'N;N;s/two.//'
Sed
соответствует всем символам (включая \n
), используя точку .
, но обычно она уже отключила \n
как часть цикла, поэтому она больше не присутствует в пространстве шаблонов
Только некоторые команды (N
, H
и G
) сохраняют символы новой строки в пространстве шаблона / удержания.
N
добавляет newline в пространство шаблонов, а затем добавляет следующую строку. H
делает то же самое, за исключением того, что он действует на удержание. G
добавляет новую строку к шаблону пробел, а затем добавляет все, что находится в пространстве удержания. Пространство удержания пусто, пока вы не поместите в него что-то, чтобы:
sed G file
введет пустую строка после каждой строки.
sed 'G;G' file
вставляет две пустые строки и т. д. и т. д.
vim
(я новый пользователь Linux). Оператор AFAIK m / M используется, чтобы сообщитьsed
переключиться в многострочный режим – theta 24 December 2011 в 13:53Hold
все, чтобыhold-space
, затемget
он, и выполните замену. – kev 24 December 2011 в 14:09