Как Установить Значение в NULL при использовании Zend_Db

Быстрый ответ:

sed ':a;N;$!ba;s/\n/ /g' file
  1. : a создать метку 'a'
  2. N добавить следующую строку в пространство шаблонов
  3. $! , если не последняя строка , ba ответвление (перейти к) метка 'a'
  4. s заменять , / \ n / регулярное выражение для новой строки , / / через пробел , / g глобальное совпадение (столько раз, сколько возможно)

sed будет перебирать шаги с 1 по 3 до тех пор, пока не достигнет последней строки, приведя все строки в соответствие шаблону, где sed заменит все \ n символов


Альтернативы :

Все альтернативы, в отличие от sed , не должны достигать последней строки, чтобы начать процесс

с bash , медленный

while read line; do printf "%s" "$line "; done < file

с perl , sed -подобная скорость

perl -p -e 's/\n/ /' file

с tr , быстрее, чем sed , может заменить только один символ

tr '\n' ' ' < file

с вставить , tr -подобной скоростью, может заменить только один символ

paste -s -d ' ' file

с awk , tr -подобной скоростью

awk 1 ORS=' ' file

Другая альтернатива, например "echo $ (< file) " медленный, работает только с небольшими файлами и должен начать весь файл, чтобы начать процесс.


Длинный ответ из sed FAQ 5.10 :

5.10. Почему я не могу сопоставить или удалить символ новой строки, используя последовательность \ n escape
? Почему я не могу сопоставить 2 или более строк, используя \ n?

\ n никогда не будет соответствовать новой строке в конце строки, потому что новая строка
всегда удаляется перед тем, как строка помещается в пространство паттернов
. Чтобы получить 2 или более строк в пространство шаблонов, используйте
команду 'N' или что-то подобное (например, 'H; ...; g;').

Sed работает следующим образом это: sed читает по одной строке за раз, отсекает завершающую новую строку
, помещает то, что осталось в пространство шаблона, где
скрипт sed может адресовать или изменять его, и когда шаблон пробел
печатается, добавляет новую строку в stdout (или в файл) .Если пространство шаблона
полностью или частично удалено с 'd' или 'D' символ новой строки
не добавляется в таких случаях. Таким образом, сценарии, подобные

  sed 's/\n//' file       # to delete newlines from each line             
  sed 's/\n/foo\n/' file  # to add a word to the end of each line         

, НИКОГДА не будут работать, потому что завершающий символ новой строки удаляется до
строки, помещенной в пространство образца. Чтобы выполнить вышеупомянутые задачи,
вместо этого используют один из этих сценариев:

  tr -d '\n' < file              # use tr to delete newlines              
  sed ':a;N;$!ba;s/\n//g' file   # GNU sed to delete newlines             
  sed 's/$/ foo/' file           # add "foo" to end of each line          

Поскольку версии sed, отличные от GNU sed, имеют ограничения на размер
шаблона буфер, утилита Unix 'tr' здесь предпочтительнее.
Если последняя строка файла содержит новую строку, GNU sed добавит
эту новую строку в вывод, но удалит все остальные, тогда как tr
удалит все новые строки.

Чтобы сопоставить блок из двух или более строк, есть 3 основных варианта:
(1) используйте команду 'N', чтобы добавить следующую строку в пространство шаблона;
(2) использовать команду «H» как минимум дважды, чтобы добавить текущую строку
к пространству удержания, а затем извлечь строки из пространства удержания
с помощью x, g или G; или (3) использовать диапазоны адресов (см. раздел 3.3 выше)
для сопоставления линий между двумя указанными адресами.

Варианты (1) и (2) помещают \ n в пространство шаблона, где к нему
можно обращаться по своему усмотрению ('s / ABC \ nXYZ / alphabet / g') , Один пример
использования 'N' для удаления блока строк приведен в разделе 4.13
(«Как удалить блок из определенных последовательных строк?») , Этот пример
можно изменить, изменив команду удаления на что-то
, например, «p» (печать), «i» (вставка), «c» (изменение), «a '(добавить),
или' s '(заменить).

Выбор (3) не будет помещать \ n в пространство шаблона, но он соответствует
блоку последовательных строк, поэтому может случиться так, что вы не наденете '
даже не нужно \ n найти то, что вы ищете. Поскольку GNU sed
версии 3.02.80 теперь поддерживает этот синтаксис:

  sed '/start/,+4d'  # to delete "start" plus the next 4 lines,           

в дополнение к традиционному диапазону '/ from here /, / to there / {...}'
адресов, может быть возможно полностью избежать использования \ n.

6
задан Noah Goodrich 23 July 2009 в 20:30
поделиться

2 ответа

Попробуйте установить для затронутых полей значение: new Zend_Db_Expr ('NULL')

22
ответ дан 8 December 2019 в 03:40
поделиться

Мне всегда удавалось сделать это с помощью PHP null:

$toUpdate = array('nullValue' => null, 'otherValue' => 'something');
Zend_Db::update($table, $toUpdate, $where);
4
ответ дан 8 December 2019 в 03:40
поделиться
Другие вопросы по тегам:

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