Раздел выбора файла с использованием sed на основе предопределенного заголовка - PullRequest
1 голос
/ 07 декабря 2011

Это выражение sed -n '/statistics:/,/^ [^ ]/ p' выбирает следующий раздел

  Channel statistics:
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 114.237 (0.447987)
      standard deviation: 115.1 (0.451372)
      kurtosis: -1.92845
      skewness: 0.0962143
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 113.318 (0.444384)
      standard deviation: 113.041 (0.443298)
      kurtosis: -1.94057
      skewness: 0.0648024
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 111.01 (0.435332)
      standard deviation: 110.498 (0.433324)
      kurtosis: -1.92769
      skewness: 0.0747213
  Image statistics:

Из следующего файла:

Image: /tmp/magick-XXpWFUXl
  Base filename: -
  Format: MIFF (Magick Image File Format)
  Class: DirectClass
  Geometry: 480x360+0+0
  Resolution: 72x72
  Print size: 6.66667x5
  Units: Undefined
  Type: TrueColor
  Base type: TrueColor
  Endianess: Undefined
  Colorspace: RGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 114.237 (0.447987)
      standard deviation: 115.1 (0.451372)
      kurtosis: -1.92845
      skewness: 0.0962143
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 113.318 (0.444384)
      standard deviation: 113.041 (0.443298)
      kurtosis: -1.94057
      skewness: 0.0648024
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 111.01 (0.435332)
      standard deviation: 110.498 (0.433324)
      kurtosis: -1.92769
      skewness: 0.0747213
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 84.6411 (0.331926)
      standard deviation: 109.309 (0.428662)
      kurtosis: -1.6052
      skewness: 0.582669
  Rendering intent: Undefined
  Interlace: None
  Background color: white
  Border color: rgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Compose: Over
  Page geometry: 480x360+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2011-12-07T12:33:31+02:00
    date:modify: 2011-12-07T12:33:31+02:00
    signature: f2adc51db916151ddcc5b206a8921eec0234efa1eeb7484c0046506b749bc392
  Artifacts:
    verbose: true
  Tainted: False
  Filesize: 179KB
  Number pixels: 173KB
  Pixels per second: 0b
  User time: 0.000u
  Elapsed time: 0:01.000
  Version: ImageMagick 6.6.0-4 2011-06-15 Q16 http://www.imagemagick.org
  • Как и почему он работает?
  • Что такое формат sed?
  • Почему выбирается раздел Channel statistics:, а не Image statistics:?

Источник выражения взят со следующей страницы http://www.imagemagick.org/Usage/compare/

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

Ваше выражение: sed -n '/statistics:/,/^ [^ ]/ p'

Как и почему это работает?

sed в естественном виде следует синтаксисуsed 's/substitution/replacement/[g]' где s для замены и необязательного g в конце для глобальной замены (если текст замены найден более одного раза в строке.

Но sed может сделать гораздо больше. У него есть возможность ограничить операцию определенными строками. Вы можете сделать это с помощью -

 1. Specifying a line by its number. 
 2. Specifying a range of lines by number.
 3. All lines containing a pattern.
 4. All lines from the beginning of a file to a regular expression
 5. All lines from a regular expression to the end of the file.
 6. All lines between two regular expressions.

Что такое формат sed?

Ваш sed format принимает последнюю форму . Он начинает выполнять свою магию со строки, содержащей statistics:, до строки, которая содержит ровно два пробела от начала строки, т.е. __[^_], где _ это пробел, то есть

sed -n '/statistics:/,/^ [^ ]/ p'
   |   ||           | |      | |
    ---  -----------   ------  V
     |        |           |    Since we suppressed
 Suppress This is     This is  the output, we need
  output   your         your   to invoke print
           start        end
           range       range

Почему он выбирает раздел Channel statistics:, а не Image statistics:?

В исходных текстовых строках после Image Statistics: с отступом ичем 2 пробела от начала строки, в результате они не отображаются. Если вы хотите включить Image Statistics: Вы можете изменить свой Address End Range, чтобы он был таким -

sed -n '/statistics:/,/^  Ren.*/p'

Why -n and p?:sed в его естественной форме печатает все.Каждая строка помещается в pattern space, после чего все действия над ней выполняются, и затем строка печатается с новой строкой.Здесь действие p означает, что будет напечатан весь текст, а строки, соответствующие диапазону sed's, будут напечатаны дважды.Чтобы предотвратить это, мы вызываем -n.Параметр -n ничего не печатает, если не будет найден явный запрос к print.

0 голосов
/ 07 декабря 2011

Как и почему это работает?

см. Ниже

Что такое формат sed?

format is sed address1, address2

> Почему он выбирает статистику канала: раздел, но не статистику изображения:?

сначала, я бы сказал, что строка sedв вашем вопросе не совсем то же самое, что и строка в вашей ссылке.это должно быть sed -n '/statistics:/,/^(two spaces)[^ ]/ p'

см. этот пример:

kent$  cat file1
x_1
 1
 2
 3
 o
x_2
 4
 5
 6

kent$  sed -n '/x/,/^[^ ]/p' file1
x_1
 1
 2
 3
 o
x_2

Я думаю, это будет очень похоже на ваш файл.

Что делает sed?

1 найдите 1-е совпадение адреса1, то есть / x /, поэтому x_1 был найден и принят.

2, затем поиск по адресу2, / ^ [^] /, если не совпадает, распечатать.это регулярное выражение означает, что строка не начинается с пробела.

3 x_2 начинается с x, а не пробела, поэтому сопоставьте address2, print.

после x_2 больше нет строки, соответствующей адресу1 / x/, поэтому x_2 должна быть последней строкой

пример файла изображения такой же, разница только в адресе2, в вашем случае строка начинается с двух пробелов.

только мои 2 цента.надеюсь, полезно.

...