Linux

排序同時忽略正則表達式模式

  • October 17, 2020

我想對文件中的 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.comfahrrad.de於 c 在 h 之前
  • www.facebook.com##body先入為主m.facebook.com##.cx_ b_.
  • m.facebook.com##.cx先入為主facebook.com###page_ ._#
  • www.fahrrad.de###userlike-footerbarfahrrad.de###userlike-popup於 f 在 p 之前

您始終可以在要跳過的部分之後添加一個字元並從那裡開始排序(然後刪除該字元):

如果您sed支持該-E選項(最新版本的 GNU seddo 和舊版本將-r取而代之,儘管這對於非 GNU 實現的可移植性較差):

<file sed -E 's/^(www\.|m\.)?/&:/' | sort -t: -k2 | sed 's/://'

可移植地,你可以用awkor做同樣的事情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/^\.//'

引用自:https://unix.stackexchange.com/questions/614974