У меня большой двоичный файл. Я хочу извлечь из него определенные строки и скопировать их в новый текстовый файл.
Например, в:
D-wM-^?^@^@^@^@^@^@^@^Y^@^@^@^@^@^@^@M-lM-FM-MM-[o@^B^@M-lM-FM MM-[o@^B^@^@^@^@^@E7cacscKLrrok9bwC3Z64NTnZM-^G
Я хочу взять число «7» (после @^@^@E
) и каждый символ после него останавливается на Z
('игнорируя M-^G
).
Я хочу скопировать 7cacscKLrrok9bwC3Z64NTnZ
в новый файл.
Там будет быть несколько таких строк в одном файле. Конец всегда будет обозначаться M-
(который я не хочу копировать). Начало всегда будет обозначаться 7
(который я хочу скопировать).
К сожалению, мои знания по grep, sed и др. c не распространяются на этот уровень. Может кто-нибудь, пожалуйста, предложить жизнеспособный способ достижения этого?
cat -v filename | grep [7][A-Z,a-z]
покажет все строки с «7», за которым следует буква, но это не так много.
Спасибо.
Я заметил, что мои требования довольно сложны.
(на этот раз я выполнил правильное, надеюсь, форматирование). Спасибо 'tshiono' за его (?) Ответ на предыдущую отправку.
Я хочу проверить окончание строки и, если она заканчивается в M-
, grep другой строки, которая следует за ней (с мусором между). Если строка не заканчивается на M-
, то я не хочу, чтобы она копировалась (не говоря уже о любых других строках).
Итак, я бы хотел:
grep -a -Po "7[[:alnum:]]+(?=M-)" file_name
и если окончание M-
, то grep -a -Po "5x[[:alnum:]]+(?=\^)" file_name
для копирования строки, начинающейся с 5x
и заканчивающейся ^
.
В этом примере:
D-wM-^?^@^@^@^@^@^@^@^Y^@^@^@^@^@^@^@M-lM-FM-MM-[o@^B^@M-lM-FM MM-[o@^B^@^@^@^@^@E7cacscKLrrok9bwC3Z64NTnZM-^GwM-^?^@^@^@^@^@^@^@^Y^@^@^@^@^@^@^@M-lM-FM-MM-[o@^B^@M-lM5x8w09qewqlkcklwnlkewflewfiewjfoewnflwenfwlkfwelk^89038432nowefe
Результат будет:
7cacscKLrrok9bwC3Z64NTnZ
5x8w09qewqlkcklwnlkewflewfiewjfoewnflwenfwlkfwelk
Однако, если окончание не M-
(точнее, если окончание ^S
), то не пытайтесь использовать второй grep и вообще ничего не записывать.
В этом примере:
D-wM-^?^@^@^@^@^@^@^@^Y^@^@^@^@^@^@^@M-lM-FM-MM-[o@^B^@M-lM-FM MM-[o@^B^@^@^@^@^@E7cacscKLrrok9bwC3Z64NTnZ^SGwM-^?^@^@^@^@^@^@^@^Y^@^@^@^@^@^@^@M-lM-FM-MM-[o@^B^@M-lM5x8w09qewqlkcklwnlkewflewfiewjfoewnflwenfwlkfwelk^89038432nowefe
Результат будет нулевым (ничего не копируется), поскольку строка 7cacs...
заканчивается на ^S
.
Является ли grep правильным орудие труда? Grep файл, и если условие в команде grep «да», тогда введите другую команду grep, но если условие «нет», то ничего не делайте.
Еще раз спасибо.
Я заметил одну дополнительную модификацию.
Можно ли добавить команду ИЛИ во вторую часть? Grep, если вторая строка начинается с 5x
ИЛИ 6x
?
В приведенном ниже примере grep -aPo "7[[:alnum:]]+M-.*?5x[[:alnum:]]+\^" filename | grep -aPo "7[[:alnum:]]+(?=M-)|5x[[:alnum:]]+(?=\^)"
извлечет строки, начинающиеся с 7
, и строки, начинающиеся с 5x
.
Как можно изменить 5x
на 5x
или 6x
?
D-wM-^?^@^@^@^@^@^@^@^Y^@^@^@^@^@^@^@M-lM-FM-MM-[o@^B^@M-lM-FM MM-[o@^B^@^@^@^@^@E7cacscKLrrok9bwC3Z64NTnZM-^GwM-^?^@^@^@^@^@^@^@^Y^@^@^@^@^@^@^@M-lM-FM-MM-[o@^B^@M-lM5x8w09qewqlkcklwnlkewflewfiewjfoewnflwenfwlkfwelk^89038432nowefe
D-wM-^?^@^@^@^@^@^@^@^Y^@^@^@^@^@^@^@M-lM-FM-MM-[o@^B^@M-lM-FM MM-[o@^B^@^@^@^@^@E7AAAAAscKLrrok9bwC3Z64NTnZM-^GwM-^?^@^@^@^@^@^@^@^Y^@^@^@^@^@^@^@M-lM-FM-MM-[o@^B^@M-lM6x8w09qewqlkcklwnlkewflewfiewjfoewnflwenfwlkfwelk^89038432nowefe
В этом примере желаемый результат будет следующим:
7cacscKLrrok9bwC3Z64NTnZ
5x8w09qewqlkcklwnlkewflewfiewjfoewnflwenfwlkfwelk
7AAAAAscKLrrok9bwC3Z64NTnZ
6x8w09qewqlkcklwnlkewflewfiewjfoewnflwenfwlkfwelk
ОБНОВЛЕНИЕ МАРТА 09:
Мне нужно создать серию сложные команды grep (или perl) для извлечения строк из серии двоичных файлов.
Мне нужны две строки из двоичного файла.
Первая строка всегда начинается с 1
.
Первая строка заканчивается буквой или цифрой. Следующая буква всегда будет строчной k
. Мне не нужен этот k
символ.
Сложность в том, что окончание k
не всегда будет первым k
в строке. Это может быть первый k
, но это не так.
После k
появляется вторая строка. Вторая строка всегда будет начинаться с A
или B
.
Окончание второй строки будет иметь одну из двух форм: a) она будет заканчиваться пробелом, а затем отображать первые три символы из первой строки в нижнем регистре, за которыми следует )
b) он заканчивается ^K
, затем отображаются первые три символа из первой строки в нижнем регистре.
Например:
1pppsx9YPar8Rvs75tJYWZq3eo8PgwbckB4m4zT7Yg042KIDYUE82e893hY ppp)
Должно быть:
1pppsx9YPar8Rvs75tJYWZq3eo8Pgwbc
и B4m4zT7Yg042KIDYUE82e893hY
- удалить k
и затем пробел ppp
.
Например :
1zzzsx9YPkr8Rvs75tJYWZq3eo8PgwbckA2m4zT7Yg042KIDYUE82e893hY^Kzzz
Должно быть:
1zzzsx9YPkar8Rvs75tJYWZq3eo8Pgwbc
и A4m4zT7Yg042KIDYUE82e893hY
- удалить второе k
и ^Kzzz
.
Во втором примере мы видим, что первый k
является частью первой строки. Это k
перед A
, которая разбивает первую и вторую строки.
Я надеюсь, что есть эксперт по супер grep, который может помочь! Большое спасибо!