найти и заменить unix tr - PullRequest
       43

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

8 голосов
/ 02 декабря 2011

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

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

однако он дает мне новые строки, но не добавляет левую корзину снова. например,

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

возвращает

 (blank line which is fine)
 hello>
 world>

вместо

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

Что не так?

Ответы [ 4 ]

20 голосов
/ 02 декабря 2011

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

Попробуйте sed вместо.

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

Или awk.

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

Или perl.

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

Или ruby.

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

Или python.

echo '<hello><world>' \
| python -c 'for l in __import__("fileinput").input():print l.replace("<","\n<")'
2 голосов
/ 04 декабря 2011

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

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

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

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

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

Однако вы должны знать, что не очень хорошая идея для анализаHTML с регулярными выражениями.

1 голос
/ 04 октября 2013

Порядок расположения новой строки важен. Также вы можете избежать "<". </p>

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

`tr '<' '<\n' < index.html` works as well.
1 голос
/ 02 декабря 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 {}.

...