ファイルからプレーンテキスト行をコピーし、中間線プレフィックスを使用して同じファイルに追加するか、中間線プレフィックスを削除します。

ファイルからプレーンテキスト行をコピーし、中間線プレフィックスを使用して同じファイルに追加するか、中間線プレフィックスを削除します。

複数のホストファイルを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.}

おすすめ記事