unix tr найти и заменить

Это команда, которую я использую на стандартной веб-странице I wget с веб-сайта.

tr '<' '\n<' < index.html

однако это дает мне новые строки, но не добавляет снова левый перерыв. например

 echo "<hello><world>" | tr '<' '\n<'

возвращается

 (blank line which is fine)
 hello>
 world>

вместо

 (blank line or not)
 <hello>
 <world>

Что случилось?


person Kamran224    schedule 01.12.2011    source источник


Ответы (4)


Это потому, что tr выполняет только посимвольную замену (или удаление).

Вместо этого попробуйте sed.

echo '<hello><world>' | sed -e 's/</\n&/g'

Or awk.

echo '<hello><world>' | awk '{gsub(/</,"\n<",$0)}1'

Or perl.

echo '<hello><world>' | perl -pe 's/</\n</g'

Or ruby.

echo '<hello><world>' | ruby -pe '$_.gsub!(/</,"\n<")'

Or python.

echo '<hello><world>' \
| python -c 'for l in __import__("fileinput").input():print l.replace("<","\n<")'
person ephemient    schedule 01.12.2011
comment
Я пробовал это, но получаю n‹hello›n‹world›. Я не знаю, что такое символ новой строки sed - person Kamran224; 02.12.2011
comment
@Kamran224 У меня это работает, но попробуйте: echo -e '‹hello›‹world›' | sed -e 's/‹/\n&/g' - person ; 02.12.2011
comment
@Kamran224 \n — это расширение GNU sed. На какой ты системе? - person ephemient; 02.12.2011
comment
@ephemient SunOS (система afs в моем кампусе) - person Kamran224; 02.12.2011
comment
В SunOS вам придется ввести новую строку вручную. В поле замены нажмите enter и продолжите замену. Для tab вам придется вручную нажимать пробелы (8 раз) или любое другое ограничение по умолчанию для tab на вашем компьютере. - person jaypal singh; 02.12.2011
comment
@ephemient Вы не дали c++ его реализацию !! :Р +1 - person jaypal singh; 02.12.2011
comment
@Jaypal Строка из 8 пробелов не равна табуляции; вам нужен буквальный символ табуляции. 8-местная вещь касается табуляции, а не табуляции. - person Michael J. Barber; 04.12.2011
comment
Используйте perl, когда вы находитесь на неуказанной машине Unix. Использование sed или tr на этих машинах может показать, что они не поддерживают ожидаемые функции. - person Yuri; 29.03.2019

Если у вас есть GNU grep, это может сработать для вас:

grep -Po '<.*?>[^<]*' index.html

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

Если вы не хотите ничего, кроме тегов:

grep -Po '<.*?>' index.html

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

person Dennis Williamson    schedule 04.12.2011

Это работает для вас?

awk -F"><" -v OFS=">\n<" '{print $1,$2}'

[jaypal:~/Temp] echo "<hello><world>" | awk -F"><" -v OFS=">\n<" '{$1=$1}1';
<hello>
<world>

Вы можете поместить регулярное выражение // (строки, для которых вы хотите, чтобы это произошло) перед действием awk {}.

person jaypal singh    schedule 01.12.2011
comment
'{$1=$1}1' короче и будет работать, если в строке больше ><. - person ephemient; 02.12.2011
comment
Это заменит меньше символов <, чем в вопросе. - person Michael J. Barber; 04.12.2011

Порядок, в котором вы помещаете новую строку, важен. Также вы можете избежать ‹.

`tr '<' '<\n' < index.html` 

работает также.

person felix747    schedule 03.10.2013