빈 줄을 그 아래 줄로 어떻게 바꿀 수 있나요?

빈 줄을 그 아래 줄로 어떻게 바꿀 수 있나요?

파일을 구문 분석했지만 몇 가지 문제가 있습니다. 빠른 수정은 빈 줄을 그 아래 줄로 바꾸는 것입니다. 그러면 어떻게 해야 합니까?

다음 파일처럼

apple

banana
big
sig

cake

로 변환되어야 한다

apple
banana
banana
big
sig
cake
cake

답변1

그리고 sed:

sed -ne '/./!{n;p;}' -e p your-file

/./! action다음을 수행하는 라인에 대한 작업을 실행합니다( n여기에서 추가 라인을 검색하여 p인쇄).아니요( !)에는 임의의 단일 문자가 포함됩니다( .는 임의의 단일 문자와 일치하는 정규식 연산자입니다).

일부 구현에는 파일을 제자리에서 편집할 수 있는 옵션 도 sed있습니다 .-i-i ''

답변2

이를 위해 awk해당 기능을 사용할 수 있습니다 . getline()이 명령은 텍스트 파일에서 빈 줄을 선택하여 작동합니다 !NF. 즉, 이는 비어 있는 줄을 의미합니다(줄 내의 필드 수가 0임). 이 getline()함수를 사용하면 우리는다음빈 행의 즉시 행이며 변수에 저장됩니다 nxt.

awk '!NF && ((getline nxt) >0){ $0 = nxt ORS nxt }1' file

그런 다음 그 일부는 변수, 포함된 개행(AND로 문자열 연결) 및 변수를 다시 결합하여 {..}라인을 구성합니다 . 호출이 기본적으로 행 포인터를 한 수준 향상시키므로 ORS두 번째 추가가 필요합니다 . getline()바라보다awk를 사용하여 파일을 영구적으로 변경하는 방법은 무엇입니까? ("내부" 편집, "sed -i"와 동일)파일을 동적으로 변경합니다.

답변3

$ awk '/^$/ { ++r; next } { print; for (i=0; i<r; ++i) print; r=0 }' file
apple
banana
banana
big
sig
cake
cake

또는

awk '/^$/ { ++r; next } { print; while (r > 0) { print; --r } }' file

동일한 출력을 제공합니다.

그러면 각 줄에 1번씩 인쇄되고 그 위의 빈 줄 수에 해당하는 숫자가 인쇄됩니다. 빈 줄은 변수에서 계산됩니다 r.

정규 표현식을 사용하여 빈 줄을 감지할 수 있지만 또는를 ^$사용할 수도 있습니다 .length == 0NF == 0

답변4

다음과 같이 이 작업을 수행할 수 있습니다.

$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp

관련 정보