我的上一个命令的输出如下所示:
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; }