Помогите с grep в BBEdit - PullRequest
       59

Помогите с grep в BBEdit

1 голос
/ 22 сентября 2009

Я хотел бы добавить следующее в BBedit.

Найти:

<dc:subject>Knowledge, Mashups, Politics, Reviews, Ratings, Ranking, Statistics</dc:subject>

Заменить на:

<dc:subject>Knowledge</dc:subject>
<dc:subject>Mashups</dc:subject>
<dc:subject>Politics</dc:subject>
<dc:subject>Reviews</dc:subject>
<dc:subject>Ratings</dc:subject>
<dc:subject>Ranking</dc:subject>
<dc:subject>Statistics</dc:subject>

OR

Найти:

<dc:subject>Social web, Email, Twitter</dc:subject>

Заменить на:

<dc:subject>Social web</dc:subject>
<dc:subject>Email</dc:subject>
<dc:subject>Twitter</dc:subject>

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

Есть мысли?

Ответы [ 5 ]

4 голосов
/ 12 мая 2011

Ничего себе. Здесь много сложных ответов. Как насчет найти:

, 

(после запятой есть пробел)

и заменить на:

</dc:subject>\r<dc:subject>
1 голос
/ 22 сентября 2009

Найти:

(.+?),\s?

Заменить:

\1\r

Я не уверен, что вы имели в виду под «переносом открытия / закрытия вокруг категории», но если вы хотите сказать, что хотите обернуть его в какой-нибудь тег или ссылку, просто добавьте его к замене.

Заменить:

<a href="http://example.com/">\1</a>\r

даст вам

<a href="http://example.com/">Social web</a>
<a href="http://example.com/">Email</a>
<a href="http://example.com/">Twitter</a>

Или полюбите Заменить:

<a href="http://example.com/tag/\1/">\1</a>\r

даст вам

<a href="http://example.com/tag/Social web/">Social web</a>
<a href="http://example.com/tag/Email/">Email</a>
<a href="http://example.com/tag/Twitter/">Twitter</a>

В последнем примере у вас может быть проблема с URL-адресом «Социальной сети», в котором есть пробел. Я бы не рекомендовал этого, но я хотел показать вам, что вы можете использовать обратную ссылку \ 1 более одного раза.

Ссылка на Grep в руководстве BBEdit просто фантастическая. Перейдите в Справка-> Руководство пользователя, а затем Глава 8. Изучение правильного использования RegEx изменит вашу жизнь.

UPDATE Странно, когда я впервые посмотрел на это, это не показало мне ваш полный пример. Исходя из того, что я вижу сейчас, вы должны

Найти:

(.+?),\s?

Заменить:

<dc:subject>\1</dc:subject>\r
0 голосов
/ 08 июля 2010

Вы не можете сделать это с помощью обычного grep. Но вы можете добавить «Unix Filter» в BBEdit, выполняя эту работу за вас:

#!/usr/bin/perl -w

while(<>) {
my $line = $_;
$line =~ /<dc:subject>(.+)<\/dc:subject>/;
my $content = $1;
my @arr;

if ($content =~ /,/) {
    @arr = split(/,/,$content);
}
my $newline = '';
foreach my $part (@arr) {
    $newline .= "\n" if ($newline ne '');
    $part =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
    $newline .= "<dc:subject>$part</dc:subject>";
}
print $newline;
}

Как добавить этот UNIX-фильтр в BBEdit, вы можете прочитать в разделе «Установка» этого раздела: http://blog.elitecoderz.net/windows-zeichen-fur-mac-konvertieren-und-umgekehrt-filter-fur-bbeditconverting-windows-characters-to-mac-and-vice-versa-filter-for-bbedit/2009/01/

0 голосов
/ 22 сентября 2009

Вы можете использовать sed для этого либо, теоретически вам просто нужно заменить "," закрывающим и открывающим <dc:subject> и символом новой строки между ними и выводить в новый файл. Но sed, похоже, не нравятся угловые скобки html ... Я пытался избежать их, но все равно получаю сообщения об ошибках, когда они включены. Это все, на что у меня было время, поэтому, если у меня будет возможность вернуться к нему, я это сделаю. Может быть, кто-то еще может решить проблему с угловыми скобками:

sed s/, /</dc:subject>\n<dc:subject>/g file.txt > G:\newfile.txt

Хорошо, думаю, я понял это. В основном пришлось поместить текст замены, содержащий угловые скобки, в двойные кавычки и изменить символ разделителя, используемый sed, на что-то другое, кроме косой черты, так как это в тексте замены, и sed это не понравилось. Я не знаю много о grep, но читал, что grep просто соответствует вещам, тогда как sed заменит, так что лучше для такого типа вещей:

sed s%", "%"</dc:subject>\n<dc:subject>"%g file.txt > newfile.txt
0 голосов
/ 22 сентября 2009

Я не использую BBEdit, но в Vim вы можете сделать это:

% s / (_ [^ <] +) </ dc: subject> / \ = substitute (submatch (0), ", [\ t] *", "</ dc: subject> \ r", "г") / г

Он будет обрабатывать несколько строк и тегов, которые охватывают контент с переносами строк. Он также обрабатывает строки с кратными, но не всегда получает новую строку между тегом close и start.

Если вы отправите это в группу Google vim_use и попросите найти решение Vim и соответствующую версию Perl, вы, вероятно, получите кучу предложений и что-то, что работает в BBEdit, а также вне любого редактора в Perl.

Don

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...