Text-Processing

按正則表達式的結果對輸入文件進行排序

  • February 5, 2016

我想根據正則表達式的結果對文件進行排序。例如,如果我在 Obj-C 中有以下屬性聲明

@property (nonatomic, strong) id <AlbumArtDelegate, UITextFieldDelegate> *albumArtView; // 1
@property (nonatomic, strong, readonly) UIImageView *profileView;  // 2
@property (nonatomic, strong, readwrite) UIButton *postFB;          // 3
@property (nonatomic, assign) UIButton *saveButton;      // 4

預設情況下,它們將按順序排序

$$ 4, 1, 2, 3 $$,但我想按實際屬性名稱的順序對它們進行排序,$$ 1, 3, 2, 4 $$. 我可以編寫一個正則表達式來梳理出屬性名稱,我可以按該表達式的結果進行排序嗎? 是否有任何內置的 Unix 工具可以為我做到這一點?我在 Xcode 中工作,所以 VIM/emacs 解決方案無濟於事。

此外,我想使用正則表達式執行此操作的原因是我可以擴展我的排序算法以在其他情況下工作。使用它對方法聲明、導入語句等進行排序。

按行內容的任意函式排序的一般方法如下:

  1. 獲取要排序的鍵,並將其複製到行首
  2. 種類
  3. 從行首刪除鍵

這是您可以在這種特殊情況下使用的鍵:該sed程序將輸出從最後一個標識符到末尾的行。

% sed -e 's/^.*[^[:alnum:]_]\([[:alpha:]][[:alnum:]_]*\)/\1/' < decls

albumArtView; // 1
profileView;  // 2
postFB;          // 3
saveButton;      // 4

將這些鍵和原始行並排放置:

% paste <(sed -e 's/^.*[^[:alnum:]_]\([[:alpha:]][[:alnum:]_]*\)/\1/' < decls) decls

對它們進行排序…

| sort

並只留下第二個欄位(原始行)

| cut -f 2-

所有在一起(以相反的順序排序,所以有一些東西要顯示):

% paste <(sed -e 's/^.*[^[:alnum:]_]\([[:alpha:]][[:alnum:]_]*\)/\1/' < decls) decls \
 | sort -r \
 | cut -f 2-

@property (nonatomic, assign) UIButton *saveButton;      // 4
@property (nonatomic, strong, readonly) UIImageView *profileView;  // 2
@property (nonatomic, strong, readwrite) UIButton *postFB;          // 3
@property (nonatomic, strong) id <AlbumArtDelegate, UITextFieldDelegate> *albumArtView; // 1

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