
파일을 구문 분석했지만 몇 가지 문제가 있으며 빠른 방법은 빈 줄을 그 아래 줄로 바꾸는 것입니다. 어떻게 해야 합니까?
다음 파일처럼
apple
banana
big
sig
cake
로 변환해야
apple
banana
banana
big
sig
cake
cake
답변1
와 함께 sed
:
sed -ne '/./!{n;p;}' -e p your-file
/./! action
수행하는 라인에 대해 작업을 실행합니다(여기서 n
ext 라인을 검색하고 린트합니다).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 == 0
NF == 0
답변4
다음과 같이 이 작업을 수행할 수 있습니다.
$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp