파일을 구문 분석했지만 몇 가지 문제가 있습니다. 빠른 수정은 빈 줄을 그 아래 줄로 바꾸는 것입니다. 그러면 어떻게 해야 합니까?
다음 파일처럼
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 == 0
NF == 0
답변4
다음과 같이 이 작업을 수행할 수 있습니다.
$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp