Linux
排序同時忽略正則表達式模式
我想對文件中的 url 列表(1 個 url/行)進行排序,這樣如果 url 以
www.
or開頭m.
,則排序完成,假設該部分不存在(或與排序無關)。有什麼建議麼?例子
facebook.com###page fahrrad.de###userlike-popup m.facebook.com##.cx www.facebook.com##body www.fahrrad.de###userlike-footerbar
排序後的文件如下所示
www.facebook.com##body m.facebook.com##.cx facebook.com###page www.fahrrad.de###userlike-footerbar fahrrad.de###userlike-popup
解釋
facebook.com
先fahrrad.de
於 c 在 h 之前www.facebook.com##body
先入為主m.facebook.com##.cx
_b
_.
m.facebook.com##.cx
先入為主facebook.com###page
_.
_#
www.fahrrad.de###userlike-footerbar
先fahrrad.de###userlike-popup
於 f 在 p 之前
您始終可以在要跳過的部分之後添加一個字元並從那裡開始排序(然後刪除該字元):
如果您
sed
支持該-E
選項(最新版本的 GNUsed
do 和舊版本將-r
取而代之,儘管這對於非 GNU 實現的可移植性較差):<file sed -E 's/^(www\.|m\.)?/&:/' | sort -t: -k2 | sed 's/://'
可移植地,你可以用
awk
or做同樣的事情perl
:<file awk '{sub(/^(www\.|m\.)?/, "&:"); print}' | sort -t: -k2 | sed 's/://'
<file perl -pe 's/^(www\.|m\.)?/$&:/' | sort -t: -k2 | sed 's/://'
儘管使用 POSIX
sed
,您總是可以這樣做:<file sed -e 's/^www\./&:/;t' -e 's/^m\./&:/;t' -e 's/^/:/' | sort -t: -k2 | sed 's/://'
或者,您可以將 a 添加
.
到不以www.
nor開頭的行的開頭,m.
並對第一個以下部分進行排序.
:<file sed -e '/^www\./b' -e '/^m\./!s/^/./' | sort -t. -k2 | sed 's/^\.//'