web-dev-qa-db-ja.com

UNIXtrの検索と置換

これは、Webサイトからwgetする標準のWebページで使用しているコマンドです。

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

しかし、それは私に改行を与えますが、左のブロケードを再び追加することはありません。例えば.

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

戻り値

 (blank line which is fine)
 hello>
 world>

の代わりに

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

どうしましたか?

11
Kamran224

これは、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<")'
22
ephemient

GNU grepがある場合、これはあなたのために働くかもしれません:

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

これはすべてのHTMLを通過する必要がありますが、各タグは行の先頭から始まり、同じ行の後にタグ以外のテキストが続く可能性があります。

タグだけが必要な場合:

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

ただし、正規表現を使用してHTMLを解析するのは お勧めできません であることを知っておく必要があります。

2

これはあなたのために働きますか?

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

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

awk{}アクションの前に正規表現//(これを実行したい行)を配置できます。

1
jaypal singh

改行を置く順序は重要です。また、「<」をエスケープすることもできます。

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

`tr '<' '<\n' < index.html` works as well.
1
felix747