как делают меня рекурсивно grep (или иначе ищите), шестнадцатеричные строки

У меня была та же проблема с Ctrl + Z и Ctrl + Y , включая соответствующий xev-вывод с «событием KeymApNotify» .

Решение состоит в следующем: назначьте новое сочетание клавиш именно таким комбинациям с xfce4-keyboard-settings и удалите их после этого. После этого снова работали Ctrl + Z (отменить) и Ctrl + Y (повторить) .

-121--54311-

В качестве решения оболочки getopts , вероятно, проще всего. Суть getopts заключается в том, что POSIX-specified делать именно то, что вы просите - обрабатывать поток байтов в оболочечном цикле. Я знаю, это звучит странно, потому что, если вы похожи на меня до того, как я узнал это, вы, вероятно, думаете, ну, боже, я думал, что это должно было работать с переключателями командной строки. Что верно, но это тоже первое. Подумайте:

-thisisonelongstringconsistingofseparatecommandlineswitches

Да, getopts должен справиться с этим. Он должен разделить этот символ по символу в цикле и вернуть вам каждый символ в переменной оболочки $ OPTARG или в другой, который вы указываете по имени все в зависимости от того, как конкретно вы получаете при его вызове. Более того, он должен возвращать ошибки в переменных оболочки и сохранять ход выполнения , когда это происходит в переменной оболочки $ OPTIND , так что он может возобновиться справа там, где он остался , если вы можете как-то решить его. И он должен выполнять всю работу, не прибегая ни к одному подслому.

Допустим, у нас есть:

arg=$(seq -s '' 1000); set --
while getopts :0123456789 v -"${arg}"
do [ "$((i=$i+1<6?$i+1:0))" -gt 0 ] ||
set "$@" "$v"
done

Ммм... Интересно, сработало ли это?

echo "$((${#arg}/6))" "$#"
482 482

Это хорошо...

eval '
printf %.1s\\n "${arg#'"$(printf %0$((124*6-1))d | tr 0 \?)"'}" "${124}"'
4
4

Таким образом, как видно, команда getopts полностью задает массив для каждого шестого байта в последовательность. И это не обязательно должны быть такие числа - и это даже не должны быть оболочечные символы - и вы даже не нужно указывать целевые символы, как я сделал это выше с 01234565789 тоже. Я неоднократно проверял это на множестве снарядов, и все они просто работают. Есть некоторые причуды - bash отбросит первый символ, если это символ пробела - dash принимает двоеточие : в качестве заданного параметра, даже если речь идет только о специально запрещенном POSIX. Но ничего из этого не имеет значения, потому что getopts по-прежнему депонирует текущее значение символа opt в $ OPTARG , даже когда он возвращает вам ошибку (представленную как? назначается указанному параметру opt var) и в противном случае явно не используется $ OPTARG , если только вы не объявили, что параметр должен иметь аргумент. А пробельная вещь вроде как хорошая - она отбрасывает только ведущее пространство, которое отлично, потому что, работая с неизвестными значениями, можно сделать:

getopts : o -" $unknown_value"

... разорвать петлю без какой-либо опасности того, что первый персонаж на самом деле окажется в ваших принятых аргах последовательности -что приведет к тому, что getopts заедет всю вещь в $ OPTARG сразу - в качестве аргумента.

Вот еще один пример:

OPTIND=1
while getopts : o -" $(dd if=/dev/urandom bs=16 count=1 2>/dev/null)"                         
do printf '\\%04o' "'$OPTARG"; done  

\0040\0150\0071\0365\0320\0070\0161\0064\0274\0115\0012\0215\0222\0271\0146\0057\0166

Я установил $ OPTIND = 1 в первой строке, потому что я только что использовал getopts и, пока вы не сбросите его, он ожидает, что его следующий вызов будет продолжаться там, где он остался - он хочет «$ {arg2}» другими словами. Но я не хочу давать, и сейчас я делаю другую вещь, поэтому я сообщаю об этом, сбрасывая $ OPTIND , на который точка хороша идти.

В этом я использовал zsh - который не спорит о ведущем пространстве - и поэтому первый символ восьмеричный 40 - символ пространства. Я обычно не использую getopts таким образом, хотя - я обычно использую его, чтобы избежать выполнения write () для каждого байта и вместо этого назначить его выход - который приходит в виде переменной - другой переменной оболочки - как я сделал это с помощью set после моды. Затем, когда я готов, я могу взять всю последовательность и когда я обычно снимаю первый байт.

-121--59681-

Следующая программа python должна делать то, что вы хотите, или что-то очень близкое к ней.

  • В required _ output.txt 3-я строка кажется ошибочной:

     Mem _ id # -aa3: time- file1.txt value = ccx3/file2.txt value = dd3
    

    dd3, вероятно, должен быть cc3 '

    Кроме того, что выходные данные программы совпадают, за исключением пробела, который кажется немного нерегулярным в выборке выходных данных.

  • Ввод рассматривается как упорядоченный по ключу (memid)

  • Программа буферизирует по умолчанию 4 строки (max_diff + 1) при попытке синхронизации. Если ни один из ключей справа в этом буфере не соответствует «текущему» ключу и vv, оба считаются несопоставимыми и печатаются, и следующая пара пробуется. Если ключ найден, несоответствующие предметы сначала находятся в другом буфере или выводе.
  • Ввод выборки немного ограничен ожидаемым поведением, когда первая и вторая строки имеют один и тот же мемид дважды (или более).

    На выходе () я пытаюсь сопоставить любые строки и все совпадающие строки (слева и справа). Поэтому порядок совпадения строк в пределах одного и того же мемида не важен. Если левое или правое или оба являются пустыми после печати легко (особенно когда оба пустые). В остальном я совпаду с каждой оставшейся строкой слева направо.

  • Вывод определяется fmt последовательностей в line _ out () , можно свободно изменить/переупорядочить это.

#! /usr/bin/env python
# coding: utf-8
# http://unix.stackexchange.com/q/161913/33055

from __future__ import print_function
from collections import OrderedDict
from logging import debug

import sys


class RowBuffer:
    def __init__(self, file_name, delim=None, max_diff=3):
        """delim is the character that is used for splitting input.
        None->whitespace
        """
        self._verbose = 0
        self._file_name = file_name
        self._fp = open(self._file_name)
        self._delim = delim
        self._max_diff = max_diff
        self._head = self._fp.readline().split(delim)
        # the buffer consists of a maximum of max_diff entries
        # the keys are the first items of a row, the value a list
        # of all other items on that row
        self._buffer = OrderedDict()
        self.fill_buffer()

    def compare(self, rb):
        """check if self._buffer"""
        if self._head != rb._head:
            print('headings differ:\n  {}\n  {}'.format(
                self._head, rb._head))
        while self._buffer:
            l = self.get()
            try:
                r = rb.get()
            except KeyError:
                debug('only left %s', l[0])
                self.output(l, None, rb)
                break
            if l[0] == r[0]:
                debug('compare vals %s', l[0])
                self.output(l, r, rb)
                continue
            if l[0] in rb:
                # left key in right, but not at top
                # output right until top keys are same
                while l[0] != r[0]:
                    debug('only right %s', r[0])
                    self.output(None, r, rb)
                    r = rb.get()
                self.output(l, r, rb)
                continue
            if r[0] in self:
                # right key in left, but not at top
                # output left until top keys are same
                while l[0] != r[0]:
                    debug('only left %s', l[0])
                    self.output(l, None, rb)
                    l = self.get()
                self.output(l, r, rb)
                continue
            # neither found: output both
            debug('neither left in right nor vv %s %s', l[0], r[0])
            self.output(l, None, rb)
            self.output(None, r, rb)
        while rb._buffer:  # remaining in right file
            r = rb.get()
            debug('only right %s', r[0])
            self.output(None, r, rb)

    def output(self, l, r, right):
        fmt1 = '{col0_header}#-{col0_value} : {col_header}-  ' \
            '{left_file_name} value = {left_value} / ' \
            '{right_file_name} value= {right_value}'
        d = dict(
            col0_header=self._head[0],
            left_file_name=self._file_name,
            right_file_name=right._file_name,
        )
        if l is not None and r is not None:
            # one or more values on both sides, compare all lines on the
            # left with all on the right remove any matching pairs
            match = {}  # left index to right index
            for lidx, lv in enumerate(l[1]):
                for ridx, rv in enumerate(r[1]):
                    if lv == rv:
                        if lidx not in match:
                            match[lidx] = ridx
            # pop from back of list, not invalidate index
            for lidx in sorted(match, reverse=True):
                l[1].pop(lidx)
            for ridx in sorted(match.values(), reverse=True):
                r[1].pop(lidx)
        if r is None or not r[1]:
            for lv in l[1]:
                for idx, k in enumerate(self._head[1:]):
                    self.line_out(d, col0_value=l[0], col_header=k,
                                  left_value=lv[idx], right_value='    ')
            return
        if l is None or not l[1]:
            for rv in r[1]:
                for idx, k in enumerate(self._head[1:]):
                    self.line_out(d, col0_value=l[0], col_header=k,
                                  left_value='    ', right_value=rv[idx])
            return
        # print non matching
        for lv in l[1]:
            for rv in r[1]:
                for idx, k in enumerate(self._head[1:]):
                    if lv[idx] == rv[idx]:
                        continue  # same value
                    self.line_out(d, col0_value=l[0], col_header=k,
                                  left_value=lv[idx], right_value=rv[idx])

    def line_out(self, d, **kw):
        # manipulate and print output
        # the fields of the format string can be arbitrarily arranged
        # as long as the field names (between {} match)
        fmt = '{col0_header}#-{col0_value} : {col_header}-  ' \
            '{left_file_name} value = {left_value} / ' \
            '{right_file_name} value= {right_value}'
        d1 = d.copy()
        d1.update(kw)
        s = fmt.format(**d1)
        # s = s.rstrip()
        s = s[0].upper() + s[1:]  # sample output doesn't match input
        print(s)

    def get(self):
        item = self._buffer.popitem(last=False)
        self.fill_buffer()
        return item

    def fill_buffer(self):
        if self._fp is None:
            return
        while len(self._buffer) < self._max_diff:
            row = self._fp.readline().split(self._delim)
            if not row:
                self._fp.close()
                self._fp = None
                return
            entry = self._buffer.setdefault(row[0], [])
            entry.append(row[1:])

    def __contains__(self, key):
        self.fill_buffer()
        return key in self._buffer

rb1 = RowBuffer(sys.argv[1])
rb2 = RowBuffer(sys.argv[2])
rb1.compare(rb2)
0
24.07.2014, 13:36
1 ответ

Не понимаю, что ты имеешь в виду. Возможно, с GNU grep:

grep -Ero '(\\x[[:xdigit:]]{2})+' .

Для соответствия строк формата \xNN (4 символа обратного слеша, x и две шестнадцатеричные цифры)

.
3
28.01.2020, 02:28

Теги

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