Bash

重新排序與 Bash 中的字元串匹配的行

  • May 19, 2020

我有一個前一個命令的輸出,如下所示:

foo 1 some-string
   P another-string
bar 5 and-another-string

我想將所有包含P一個或多個空格的行移到頂部,同時保持其他行的順序,例如:

   P another-string
foo 1 some-string
bar 5 and-another-string

行數未知。如果可能的話,它應該是普通的 bash 或sed.

sed -n '
/ P /p   #If line contains " P ", print it
/ P /!H  #Else, append it to hold space
${       #On last line
 x      #Exchange hold space with pattern space
 s|\n|| #Remove first extra newline
 p      #Print
}' file

使用等效的單線執行範例:

$ cat file
foo 1 some-string
   P another-string
bar 5 and-another-string
APstring
   A P string
ipsum
ARP
   P VC
$ sed -n '/ P /p;/ P /!H;${x;s|\n||;p;}' file
   P another-string
   A P string
   P VC
foo 1 some-string
bar 5 and-another-string
APstring
ipsum
ARP

鑑於需要將所有包含 P 的行(前後有一個或多個空格)移動到頂部,同時保持其他行的順序,我會使用grep

{ grep '  *P  *' file; grep -v '  *P  *' file; }

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