이전 명령의 출력은 다음과 같습니다.
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; }