2013-11-14 2 views
0

у меня есть данные в следующем виде в файле:сохранить только содержимое указано в строке

<string1> abc:string2 <http://yago-knowledge.org/resource/wikicategory_Sports_clubs_established</text\u003e\n______<sha1\u003eqwjfowt5my8t6yuszdb88k2ehskjuh0</sha1\u003e\n____</revision\u003e\n__</page\u003e\n__<page\u003e\n____<title\u003ePortal:Tropical_cyclones/Anniversaries/August_22</title\u003e\n____<ns\u003e100</ns\u003e\n____<id\u003e7957689</id\u003e\n____<revision\u003e\n______<id\u003e446349886</id\u003e\n______<timestamp\u003e2011-08-23T17:38:19Z</timestamp\u003e\n______<contributor\u003e\n________<username\u003eLightbot</username\u003e\n________<id\u003e7178666</id\u003e\n______</contributor\u003e\n______<comment\u003eDelink_non-obscure_units._Conversions._Report_bugs_to_[[User_talk:Lightmouse>. 

Разделитель в приведенном выше файле вкладка (\t), то есть string1 отделена от abc:string2 от \t. Аналогично для остальных строк.

Теперь я хочу сохранить только алфавиты, цифры, /, :, '.' и _ в строках, которые заключены в пределах <>. Я хочу удалить все символы, кроме указанных, из строк, которые были добавлены в <>.

Есть ли способ, которым я могу достичь этого, используя команды linux или python? Я хочу заменить все нежелательные символы символом подчеркивания.

<string1> abc:string2 <http://yago-knowledge.org/resource/wikicategory_Sports_clubs_established_text_u003e_n_______sha1_u003eqwjfowt5my8t6yuszdb88k2ehskjuh0_sha1_u003e_n_____revision_u003e_n___/page_u003e_n___page_u003e_n_____title_u003ePortal:Tropical_cyclones/Anniversaries/August_22_/title_u003e_n_____ns_u003e100_/ns_u003e_n_____id_u003e7957689_/id_u003e_n_____revision_u003e_n_______id_u003e446349886_/id_u003e_n_______timestamp_u003e2011-08-23T17:38:19Z_/timestamp_u003e_n_______contributor_u003e_n_________username_u003eLightbot_/username_u003e_n_________id_u003e7178666_/id_u003e_n_______/contributor_u003e_n_______comment_u003eDelink_non-obscure_units._Conversions._Report_bugs_to___User_talk:Lightmouse>. 

Есть ли способ, которым я могу достичь этого?

+0

В вашем вопросе было бы лучше придерживаться либо sed, либо python, поскольку это два инструмента с очень разными областями применения. Или что вы имеете в виду «из командной строки», в Linux один лайнер? В таком случае, почему бы и нет? –

+0

Я удалил «sed» из вопроса. Я хочу сказать, есть какой-то способ в python или linux для достижения того же. Даже если это не один лайнер, это меня не имеет значения. –

+0

Не будет ли замена «sed» с использованием выражения с отрицанием скобки в [regex] (http://linux.die.net/man/7/regex)? – rickhg12hs

ответ

0

Вы, вероятно, можно достичь только с помощью инструментов UNIX и некоторых сумасшедший регулярного выражения, но я хотел бы написать небольшой скрипт на Python для этого:

  • Открыть два файл (вход и выход) с open()
  • итерации над входной файл построчно: for line in input_file:
  • Split линия на вкладке: for part in line.split('\t'):
  • Проверить, если часть заключена в <>: if part.startswith('<') and line.endswith('>'):
  • Фильтр символов с регулярным выражением: filtered_part = re.sub(r'[^a-zA-Z0-9/:._]', '', part)
  • Регистрация отфильтрованные части вместе: filtered_line = '\t'.join(filtered_parts)
  • Написать отфильтрованную строку в выходной файл: output_file.write(filtered_line + '\n')

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

Смежные вопросы