複数のホストファイルを1つの大きなリストにコンパイルする醜いスクリプトを作成します。
www.
ほとんどのリストには、次の2つのURLエントリがあります。一つはあり、もう一つはありません。
127.0.0.1 facebook.com
127.0.0.1 www.facebook.com
しかし、私のリストのいくつかはそれほど倍増しませんが、そうなることを願っています。次のように散在しているURLがたくさんあります。
127.0.0.1 twitter.com
127.0.0.1 www.facebook.com
127.0.0.1 subdomain.facebook.com
127.0.0.1 tumblr.com
127.0.0.1 www.reddit.com
私が望むのは、ファイルにリストされているURLをスキャンして、www.
一致しないすべての行と一致しないwww.
すべての行を確認し、欠落している行をリストに追加したいと思います。私のリストは次のとおりです。www.
www.
127.0.0.1 twitter.com
127.0.0.1 www.twitter.com
127.0.0.1 facebook.com
127.0.0.1 subdomain.facebook.com
127.0.0.1 www.facebook.com
127.0.0.1 www.subdomain.facebook.com
127.0.0.1 tumblr.com
127.0.0.1 www.tumblr.com
127.0.0.1 reddit.com
127.0.0.1 www.reddit.com
sort -u
順番にする必要はありません。最後の手順でファイルを実行したときに、行の欠落をすべてファイルの末尾に追加するだけです。
ベストアンサー1
スキャンをスキップしてペアの行を追加したら、出力を次にパイプすることができますsort -u
。
sed '/ www./{ # if line matches www.
h # copy it over the hold buffer
s// / # remove the www. part
G # append the original line to the modified one
}
//!{ # if line doesn't match www.
h # copy it over the hold buffer
s/ / www./ # add the www. part
G # append the original line to the modified one
}
' infile | sort -u
これは、2つの列(IPとURL)がスペースで区切られていると仮定します。必要に応じて正規表現を調整します。
または を使用してzsh
配列の行を読み込み、www.
存在する部分を削除し、結果を一意の要素配列に保存してから、各要素をそのまま1回、追加されたwww.
部分として1回、2回印刷できます。
mylist=(${(f)"$(<infile)"})
for i (${(u)mylist[@]/ www./ }) printf '%s\n' ${i} ${i/ / www.}