В BASH удалите все между двумя наборами символов - PullRequest
2 голосов
/ 18 апреля 2011

Я объединил кучу файлов электронной почты в один большой текстовый файл, и теперь я пытаюсь удалить все строки заголовков из электронных писем из этих новых текстовых файлов.У меня есть набор уникальных символов, которые я могу использовать в качестве маркеров для удаления между ними, но я не могу найти RegEx, который удалит заголовочные файлы.Пример набора приведен ниже (включая две звездочки и двойное равенство внизу).


**


 w54cs6547wem;         Sat, 30 Oct 2010 00:06:43 -0700 (PDT)
 s10mr13764658ybi.218.1288422402631;         Sat, 30 Oct 2010 00:06:42 -0700 (PDT)


p13si451872ybk.2.2010. .36;         Sat, 30 Oct 2010 00:06:42 -0700 (PDT)

  Sat, 30 Oct 2010 02:01:23 -0500 

Date: Sat, 30 Oct 2010 02:01:22 -0500 Subject: 
Message-ID:  
Thread-Index: Act4ABHi0HfIPTIzRwe9oy8ojziTig==

Ответы [ 5 ]

2 голосов
/ 18 апреля 2011
sed -i '/\*\*/,/==/d' FILE 

изменяет ваш файл на месте (-i),

sed '/\*\*/,/==/d' FILE > MODIFIED

сохраняет изменение во вновь созданном файле.

2 голосов
/ 18 апреля 2011

Я не знаю синтаксиса замены bash, но вам нужно следующее регулярное выражение:

/\*\*.*?==/

В PHP код будет:

$str = preg_replace('/\*\*.*?==/', '', $str);

Надеюсь, вы сможете перевести этов bash без проблем.

Объяснение:

Хитрость здесь в том, что .*?.? делает .* ленивым, поэтому он будет начинаться с ** и будет соответствовать всему, пока не будет первый ==, который он найдет.Без ?, .* был бы жадным и захватывал бы все между первым ** и последним == в документе.Так что если у вас есть что-то вроде этого:

**foo==bar **baz==quux **abc==xyz

... использование /\*\*.*?==/ в качестве вашего регулярного выражения даст вам bar quux xyz, тогда как /\*\*.*==/ даст только xyz.

1 голос
/ 18 апреля 2011

Если вы собираетесь это сделать, скорее всего, вы будете обрабатывать весь файл в памяти.Вот строчный подход.

$> cat  file
some words
here that i want
**


 w54cs6547wem;         Sat, 30 Oct 2010 00:06:43 -0700 (PDT)
 s10mr13764658ybi.218.1288422402631;         Sat, 30 Oct 2010 00:06:42 -0700 (PDT)


p13si451872ybk.2.2010. .36;         Sat, 30 Oct 2010 00:06:42 -0700 (PDT)

  Sat, 30 Oct 2010 02:01:23 -0500

Date: Sat, 30 Oct 2010 02:01:22 -0500 Subject:
Message-ID:
Thread-Index: Act4ABHi0HfIPTIzRwe9oy8ojziTig==

other words
here that i also want

$> awk '/^\*\*/{f=1;next} f&&/==$/{f=0;next} f{next} !f' file
some words
here that i want

other words
here that i also want

Идея состоит в том, чтобы установить флаг, когда найден **, затем пропустить строку, пока не будет найден ==.

0 голосов
/ 18 апреля 2011

Это легко выразить в perl: cat file | perl -p -i -e 'undef $_ if /^\*\*/ .. /==$/'. То же самое для sed: cat file | sed -e '/^\*\*/,/==$/d'.

0 голосов
/ 18 апреля 2011

В vim вы можете сопоставить ключ для этого:

map !! /\*\*^Mmk/==^Mjd`k

Где ^ M на самом деле контроль-V-M

Нажатие !! удалит все между ** и ==

Вы можете поместить эту карту в файл .vimrc, чтобы сделать ее глобальной.

...