빈 줄을 그 아래 줄로 바꾸는 방법은 무엇입니까?

빈 줄을 그 아래 줄로 바꾸는 방법은 무엇입니까?

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

다음 파일처럼

apple

banana
big
sig

cake

로 변환해야

apple
banana
banana
big
sig
cake
cake

답변1

와 함께 sed:

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

/./! action수행하는 라인에 대해 작업을 실행합니다(여기서 next 라인을 검색하고 린트합니다).p~ 아니다( !)에는 단일 문자가 포함됩니다( .는 단일 문자와 일치하는 정규식 연산자입니다).

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

답변2

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

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

그런 다음 내부 부분은 {..}변수, 포함된 새 줄(문자열 연결 ORS) 및 다시 변수를 결합하는 줄을 구성합니다. 두 번째 추가가 필요합니다. getline()기본적으로 호출은 라인 포인터를 한 레벨씩 향상시키기 때문입니다. 보다awk를 사용하여 파일을 영구적으로 변경하는 방법은 무엇입니까? (“sed -i”와 마찬가지로 “in-place” 편집)파일을 동적으로 변경합니다.

답변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

관련 정보