sed не жадно сопоставляет подстановочные знаки для обрезки частей строки

В данном случае есть интересные факты, особенно эти:

  • Я только что проверил полученный и предоставленный мне вывод (на этот раз я использовал другой диск, а именно, установочный диск Xubuntu 15.04 x64), и с помощью обеих процедур (dd и pv) контрольные суммы являются идентичными.
  • Мне пришла в голову идея после выполнения процедуры dd открыть диск и закрыть его тем же самым диском, а затем закончить тест процедурой pv. Сделав это, я получил идентичные копии с обеих процедур.
  • Я думаю в первый раз получил разные контрольные суммы, потому что по каким-то причинам данные, собранные с CD/DVD диска, почему-то "записываются" на какое-то время в другие цели (например, в кэш) - таким образом, другие операции, например, контрольные суммы, выполнялись намного быстрее, чем передача. Пожалуйста, прокомментируйте, если вам известна точная причина этого.
  • Другой факт: dd w/o параметр count=X правильно останавливается в конце диска и дает то же самое изображение диска, что и с pv (контрольные суммы идентичны), поэтому мне лучше использовать dd w/o параметры или просто pv.

Итак, на данный момент, кажется, что pv и dd могут сделать копию CD/DVD с теми же результатами.

5
16.02.2018, 13:51
3 ответа

Puedo darle una solución simple awk.

php -i | awk -F ' => ' '/extension_dir/{print $2; exit}'

Eso funcionará si quieres perder el sed.

EDITAR :Se movió la salida al interior del bloque para evitar un error de sintaxis, se agregaron espacios alrededor del separador de campo para que no se envíen con la ruta de archivo resultante y se describa el cambio en el cuerpo, por lo que stackexchange permite la edición debido al mínimo limitación de cambio de carácter.

8
27.01.2020, 20:32
php -i | sed -n '/extension_dir/{s/^[^/]*//;s/ *=>.*$//;p;}'

o, como se sugiere en los comentarios a continuación,

php -i | sed '/extension_dir/!d;s/[^/]*//;s/ *=>.*//'

El sedanterior reemplaza su grepy, por cada línea que coincida con extensions_dir, primero eliminará todo hasta el primer /y luego todo desde el primer =>en adelante en el cadena modificada. Cualquier espacio antes del =>también se elimina. Las líneas que no coinciden con extensions_dirse ignoran.

Esto devolverá la ruta deseada para la primera línea de entrada y una línea vacía para la segunda.

Para ignorar la segunda línea de entrada, use /^extension_dir/en lugar de /extension_dir/en el sedanterior. Esto descartará la segunda línea ya que no comienza con esa cadena.


Es la combinación de sus dos sedscripts lo que produce el resultado sorprendente para la segunda línea de entrada.

La línea es

sqlite3.extension_dir => no value => no value

y el primero sedmodificará esto a

sqlite3.no value => no value

El segundo sedeliminará el bit => no valueal final.


Tenga en cuenta que

echo $(... )

es un poco inútil ya que engulle las nuevas líneas en la salida del comando dentro de $(... ). En su lugar, pruebe solo con el comando sin la sustitución del comando echoo $(... ).

Es posible que este uso de echolo haya confundido acerca de la naturaleza de la salida de php -iygrep(dos líneas coincidentes en lugar de una ).

8
27.01.2020, 20:32

Если путь не содержит пробелов, этого выражения будет достаточно:

php -i | grep -Po 'extension_dir => \K/[^ ]*'

Вход

extension_dir => /some/path/php/extensions/no-debug-non-zts-20160303 => /some/path/php/extensions/no-debug-non-zts-20160303
sqlite3.extension_dir => no value => no value

Выход

/some/path/php/extensions/no-debug-non-zts-20160303
2
27.01.2020, 20:32

Теги

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