0

mirrorlist.pacnew次のようなミラーを含むファイル ( ) があります。

prakhar@inS4n3 ~ $ cat /etc/pacman.d/mirrorlist.pacnew 
...
## Worldwide
#Server = https://dgix.ru/mirrors/archlinux/$repo/os/$arch
#Server = http://mirror.rackspace.com/archlinux/$repo/os/$arch

## Australia
#Server = http://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch
...

ミラーを選択し、それらのコメントを解除することになっています。ただし、ツールrankmirrorsが最適なミラーを決定するため、すべてのミラーのコメントsedを外します。

prakhar@inS4n3 ~ $ cat /etc/pacman.d/mirrorlist.pacnew | sed -r 's/^#([^#]+)/#\1\n\1/'
...
## Worldwide
#Server = https://dgix.ru/mirrors/archlinux/$repo/os/$arch
Server = https://dgix.ru/mirrors/archlinux/$repo/os/$arch
#Server = http://mirror.rackspace.com/archlinux/$repo/os/$arch
Server = http://mirror.rackspace.com/archlinux/$repo/os/$arch

## Australia
#Server = http://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch
Server = http://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch
...

ランクミラーがそれらを印刷し、進行状況を追跡できるため、コメント行を保持しています(処理中のコメント行は印刷されません)。

ただし、サーバー数と合計数も各行に出力したいと思いsedます。awk

具体的には:

  1. 上記の例で示したように、行のコメントを外します。
  2. 元のファイルから現在の#Serverインデックスのインデックスを出力します (ファイルには国名や一般的なコメントが含まれているため、実際の行番号ではありません)。

最終的な出力は次のようになります。

#22/247 Server = http://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch
Server = http://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch

ここに完全なファイルのコピーがあります。

編集:

私は自分自身である程度の進歩を遂げましたが、上記を達成しましたが、最適ではなかったので、自分の仕事を答えとして追加しました。

4

2 に答える 2

2

awk に同じファイルを 2 回渡します。最初のパス、カウントを取得します。セカンドパス、交代。

awk 'NR==FNR {
         if( /^#Server *=/)count++;
         next;
     }
     /#Server *=/{
         sub(/^#*/,"");
         print "#" ++i "/" count " " $0;
    }
    1' serverlist serverlist

与えます:

## Worldwide
#1/3 Server = https://dgix.ru/mirrors/archlinux/$repo/os/$arch
Server = https://dgix.ru/mirrors/archlinux/$repo/os/$arch
#2/3 Server = http://mirror.rackspace.com/archlinux/$repo/os/$arch
Server = http://mirror.rackspace.com/archlinux/$repo/os/$arch

## Australia
#3/3 Server = http://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch
Server = http://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch
于 2015-07-16T11:42:41.217 に答える
1

sedのみgrep

prakhar@inS4n3 ~ $ COUNT=$(grep -c "Server" /etc/pacman.d/mirrorlist.pacnew); cat /etc/pacman.d/mirrorlist.pacnew | sed -r 's/^#([^#]+)/\1/;tx;d;:x'| sed = | sed 'N;s/\n/ /' | sed -r 's/([0-9]+?)\sServer\s=\s(.*)/#\1 \/ '$COUNT' Trying \2\nServer = \2/'
...
#241 / 247 Trying http://mirrors.rutgers.edu/archlinux/$repo/os/$arch
Server = http://mirrors.rutgers.edu/archlinux/$repo/os/$arch
#242 / 247 Trying http://mirror.umd.edu/archlinux/$repo/os/$arch
Server = http://mirror.umd.edu/archlinux/$repo/os/$arch
#243 / 247 Trying http://mirror.vtti.vt.edu/archlinux/$repo/os/$arch
Server = http://mirror.vtti.vt.edu/archlinux/$repo/os/$arch
#244 / 247 Trying http://mirrors.xmission.com/archlinux/$repo/os/$arch
...

TODO :

  1. これは最適ではないことは確かです。
  2. 読みにくい
  3. 一般的なコメントを削除します ( #Worldwide )

EDIT : 一般的なコメントを処理するには:

user@host $ RANDOM_CHARACTER='@'
user@host $ sed ':b;N; $!bb; s|\n|'"$RANDOM_CHARACTER"'|g;s/#Server/#\nServer/g' /etc/pacman.d/mirrorlist.pacnew | \
    sed '2,$=' | \
    sed -r '/^[0-9]*$/{s|(.*)|echo "$((\1-1))/'$COUNT' "|e; N; s|\n([^'"$RANDOM_CHARACTER"']*)|\1'"$RANDOM_CHARACTER"'\1|}' | \
    sed ':b;N; $!bb;s|\n||g;s|'"$RANDOM_CHARACTER"'|\n|g'

ファイルの内容に基づいてランダムな文字を選択します-ファイルに存在せず、sedコマンドの区切り文字として使用されない任意の文字。

于 2015-07-16T11:57:48.350 に答える