Это не точно, как Вы структурировали его, но, учитывая Вашу фактическую цель будет более просто захватить часть перед двоеточием и видом этим. Вот сценарий Perl, который накапливает строки от отдельных ключей сортировки в записях отдельного массива и сбрасывает vcard, когда он достигает конца.
#!/usr/bin/perl -n
BEGIN {
@headers = qw(BEGIN VERSION FN N NICKNAME EMAIL X- TEL ADR ORG TITLE BDAY URL ROLE NOTE END);
for $h (@headers) { $data{$h} = ""; }
}
if (/^([^:]+):/) {
$data{exists $data{$1} ? $1 : "X-"} .= $_;
if ($1 eq 'END') {
for $h (@headers) { print $data{$h}; $data{$h} = ""; }
}
} else {
print;
}
И если Вы действительно хотите полную regexp гибкость, выполняете итерации по regexps вместо того, чтобы искать ключ в хеше.
#!/usr/bin/perl -n
BEGIN {
@regexps = qw(^BEGIN:VCARD\r$ ^VERSION[^A-Z] ^FN[^A-Z] ^N[^A-Z] ... ^END:VCARD\r$);
for $r (@regexps) { $data{$r} = ""; }
}
for $r (@regexps) {
next unless $_ =~ $r;
$data{$r} .= $_;
last;
}
if ($_ =~ $regexps[@regexps-1]) {
for $r (@regexps) { print "++", $data{$r}; $data{$r} = ""; }
}
Я думаю, что нашел некоторое рабочее решение здесь.
Сценарии Bash, если существует то, что я искал и они, по-видимому, используют wmctrl
!
В быстрых целях доступа/архивации I copy-n-paste оба сценария здесь:
Переход к вниманию требующего окна:
#!/bin/bash
activeWinIdLine=`xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\) `
activeWinId="${activeWinIdLine:40}"
echo $activeWinId > ~/activeWinId
for id in `wmctrl -l | cut -d " " -f 1`; do
xprop -id $id | grep "_NET_WM_STATE_DEMANDS_ATTENTION" 2>&1 > /dev/null
if [ "$?" = "0" ]; then
wmctrl -i -a $id
exit 0
fi
done
exit 1
Переходы назад к окну Вы были заняты:
#!/bin/bash
if [ -f ~/activeWinId ]; then
origWinId=`cat ~/activeWinId`
wmctrl -i -a $origWinId
fi
Спасибо за обсуждение, особенно @slm для направления меня на правильном выводе.
Есть небольшой рабочий проект C seturgent (спасибо hiltjo). Использование:
seturgent <winid> [0|1] # 0: urgent off, 1: urgent on
Копирование источника seturgent.c :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
static void die(const char *s) {
fputs(s, stderr);
exit(EXIT_FAILURE);
}
static void seturgency(Display *dpy, Window winid, Bool set) {
XWMHints *hints = XGetWMHints(dpy, winid);
if(!hints) {
fputs("seturgent: unable to get window manager hints.\n", stderr);
return;
}
if(set)
hints->flags |= XUrgencyHint;
else
hints->flags &= ~XUrgencyHint;
if(!XSetWMHints(dpy, winid, hints))
fputs("seturgent: unable to set urgency hint.\n", stderr);
XFree(hints);
}
int main(int argc, char **argv) {
Display *dpy;
if(argc < 2 || !strcmp(argv[1], "-h")) /* help / usage */
die("Usage: seturgent <winid> [0|1]\n");
if(argc == 2 && !strcmp(argv[1], "-v")) /* version */
die("seturgent-"VERSION" © 2010-2012 seturgent engineer, see " \
"LICENSE file for details.\n");
if(!(dpy = XOpenDisplay(NULL)))
die("seturgent: unable to open display.\n");
/* set the urgency hint (or not), if not specified its True. */
seturgency(dpy, (Window)strtol(argv[1], NULL, 0),
!((argc > 2) && !atol(argv[2])));
XSync(dpy, False);
XCloseDisplay(dpy);
return EXIT_SUCCESS;
}