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; }

관련 정보