sed -e '
/^ord:/,/^--*$/!b
H; /^ord:/h
/^--*$/!d; g
/^ord:chandru[ ]/!d
/\n[ ]*KEY:ZZ\n--*$/!d
' sample.txt
Краткое содержание:
/../,/../
=> - оператор диапазона для выбора диапазона строк, например, в вашем случае от / ord: / до / ---- /
.
Мы перемещаем эти диапазоны (диапазон за раз) в зону трюма. Затем, когда мы находимся в конце диапазона / --- /
, мы знаем, что пришло время выбрать или отклонить этот конкретный диапазон на основе критериев, которые `a) / ord: chandru / && b ) / ключ: ZZ / '
Файл include /usr/include/X11/XWDFile.h
, который является частью X11, содержит больше информации. Я нашел этот файл в rpm xorg-x11-proto-devel
в моей системе. В частности, HeaderSize
, который, согласно вашей ссылке, всегда равен 40, неверен. В заголовочном файле сказано header_size = SIZEOF(XWDheader) + длина null-terminated имени окна. Далее в файле есть полезные комментарии
Нуль-терминированное имя окна следует за вышеприведенной структурой. Далее следуют структуры XWDColor, по смещению XWDFileHeader.header_size в файле. XWDFileHeader.ncolors указывает, сколько структур XWDColor есть.
Вот небольшая программа на языке python для чтения начала файла xwd и печати некоторой информации. Он вычисляет смещение до первых пикселей изображения:
#!/usr/bin/python
import sys, struct
XWDColorlen = 4*3*2+2*1
MSBFirst = 1
class Xwd:
def __init__(self,data):
(self.header_size,
self.file_version,
self.pixmap_format,
self.pixmap_depth,
self.pixmap_width,
self.pixmap_height,
self.xoffset,
self.byte_order,
self.bitmap_unit,
self.bitmap_bit_order,
self.bitmap_pad,
self.bits_per_pixel,
self.bytes_per_line,
self.visual_class,
self.red_mask,
self.green_mask,
self.blue_mask,
self.bits_per_rgb,
self.colormap_entries,
self.ncolors,
self.window_width,
self.window_height,
self.window_x,
self.window_y,
self.window_bdrwidth) = struct.unpack(">25I",data[:100])
f = file(sys.argv[1])
data = f.read()
xwd = Xwd(data)
print("header_size %d ncolors %d" % (xwd.header_size, xwd.ncolors))
offset = xwd.header_size+xwd.ncolors*XWDColorlen
print("offset %d 0x%x" % (offset,offset))
print("bits_per_pixel %d" % xwd.bits_per_pixel)
if xwd.bits_per_pixel==32:
if xwd.byte_order==MSBFirst:
fmt = ">I"
else:
fmt = "<I"
for i in range(20):
print("%08x" % struct.unpack(fmt,data[offset:offset+4]))
offset += 4
Примененный к предоставленному вами примеру данных, он говорит
header_size 124 ncolors 256
offset 6780 0x1a7c
bits_per_pixel 32
Я вижу, что существует также perl pod для исследования изображений xwd.