Программа Sed - удаленные строки появляются снова? - PullRequest
0 голосов
/ 11 октября 2011

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

<h1 class="fn" id="myname">My Name</h1>
<span class="street-address">123 street</span>
<span class="locality">City</span>&nbsp;
<span class="region">Region</span>&nbsp;&nbsp;
<span class="postal-code">1A1 A1A</span>
<span class="email">my@email.ca</span>
<span class="tel">000-000-0000</span>

Я бы хотел, чтобы это было сделано в следующем текстовом формате:

My Name

123 street
City Region  1A1 A1A
my@email.ca
000-000-0000

Ключ в том, что город, регион и почтовый индекс теперь находятся в одной строке.
Я использую sed -f commands.sed file.html > output.txt иЯ полагаю, что следующая программа sed (commands.sed) должна поместить его в этот формат:

#using the '@' symbol as delimiter instead of '/'
#remove tags
s@<.*>\(.*\)</.*>@\1@g
#remove the nbsp
s@\(&nbsp;\)*@@g
#add a newline before the address (actually typing a newline in the file)
s@\(123 street\)@\
\1@g
#and now the command that matches multiline patterns
#find 'City',read in the next two lines, and separate them with spaces
/City/ {
N
N
s@\(.*\)\n\(.*\)\n\(.*\)@\1 \2  \3@g
}

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

My Name

123 street
City <span class="region">Region</span>&nbsp;&nbsp;  <span class="postal-code">1A1 A1A</span>
my@email.ca
000-000-0000

На мой (относительно неопытный) взгляд, похоже, что sed «забывает» сделанные изменения (снимая метки).Как бы я решил это?Есть ли решение написать файл после трех команд и перезапустить sed для четвертой?Я неправильно использую sed?Я неправильно понимаю «потоковую» часть?

Я использую Mac OS X 10.4.11 с оболочкой bash и использую прилагаемую версию sed.

Ответы [ 3 ]

1 голос
/ 11 октября 2011

Я думаю, вы в замешательстве.Sed работает построчно и выполняет все команды в строке, прежде чем перейти к следующей.Вы, кажется, предполагаете, что он удаляет теги на всех строках, затем возвращается и запускает остальные команды на удаленных строках.Это просто не тот случай.

0 голосов
/ 16 октября 2011

Если у вас есть только один блок данных на файл php, попробуйте следующее (используя sed)

kent$  cat t
<h1 class="fn" id="myname">My Name</h1>
<span class="street-address">123 street</span>
<span class="locality">City</span>&nbsp;
<span class="region">Region</span>&nbsp;&nbsp;
<span class="postal-code">1A1 A1A</span>
<span class="email">my@email.ca</span>
<span class="tel">000-000-0000</span>

kent$  sed 's/<[^>]*>//g; s/&nbsp;//g' t |sed '1G;3{N;N; s/\n/ /g}'
My Name

123 street
City Region 1A1 A1A
my@email.ca
000-000-0000
0 голосов
/ 11 октября 2011

См. RegEx сопоставляет открытые теги, за исключением автономных тегов XHTML ... и прекращает использовать sed для этого.

Sed - замечательный инструмент, но не для обработки HTML.Я предлагаю использовать Python и BeautifulSoup , который в основном построен именно для такого рода задач.

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