对 Bash 中匹配字符串的行重新排序

对 Bash 中匹配字符串的行重新排序

我的上一个命令的输出如下所示:

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.

答案1

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

答案2

鉴于需要将包含 P 且前后有一个或多个空格的所有行移动到顶部,同时保持其他行的顺序,我将使用grep

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

相关内容