첫 번째 빈 줄을 두 줄의 내용으로 바꾸는 방법은 무엇입니까? 문제가 있는 것 같아요vim sed에서 여러 개의 빈 줄을 단일 빈 줄로 바꾸기그러나 이에 적응하는 방법을 잘 이해하지 못합니다. 예를 들어, 내 입력 파일이 다음과 같다면:
% abd
% def
% jkl
% mno
sed 명령으로 대체하고 싶습니다첫 번째다음 두 줄을 포함하는 빈 줄(하나는 포함 ghi
, 다른 하나는 포함 %
):
% abd
% def
% ghi
%
% jkl
% mno
답변1
Sed는 줄 바꿈을 제외한 전체 줄과 일치하므로 빈 줄은 단지 빈 문자열입니다. 를 사용하여 ^
줄의 시작과 끝을 일치시켜 빈 줄을 일치시킬 수 $
있습니다 . ^$
다음으로 바꾸십시오 % ghi\n%
.
sed 's/^$/% ghi\n%/'
% ghi
이미 기존 줄 바꿈이 유지되므로 한 %
줄과 다음 줄로 끝납니다.
편집하다: 한 번만 일치시키면 표현식이 약간 더 복잡해집니다. 내가 아는 가장 간단한 방법 sed
은 다음과 같습니다.
sed '0,/^$/ s/^$/% ghi\n%/'
대체 항목은 주소 범위 내에 포함됩니다 0,/^$/
. 이는 "0과 첫 번째 일치하는 줄 사이의 줄에만 다음을 적용 ^$
"한다는 의미입니다. 대체 표현식 ^$
도 검사되므로 실제로 변경되는 유일한 줄은 일치하는 첫 번째 줄 ^$
, 즉 첫 번째 빈 줄 입니다.
답변2
다음은 사용 sed
하지 않고 첫 번째 빈 줄만 바꾸는 또 다른 방법입니다.\n
오른쪽 스핀들또는gnu sed
주소 0개확장하다:
sed '/^$/{ # if line is empty
x # exchange pattern space w. hold space
//{ # if pattern space is empty (means the hold buffer was empty)
s//%/ # replace it with a % character
h # overwrite hold space (so now hold space looks like this: ^%$)
s/$/ ghi/ # add a space and the string ghi after the %, then
G # append content of hold buffer to pattern space so now the
} # pattern space looks like this: ^% ghi\n%$
//!x # if pattern space is not empty it means a change was
} # already made so exchange back (do nothing)
' infile
짧막 한 농담:
sed -e'/^$/{x;//{s//%/;h;s/$/ ghi/;G' -e'}' -e'//!x' -e'}' infile
솔직히 말해서 이것은 다음과 같은 사람들을 위한 케이크 조각입니다 ed
:
ed -s infile <<< $'/^$/s//% ghi\\\n%/\n,p\nq'
파일을 제자리에서 편집하여 ,p
대체 했습니다 .w
답변3
참고: 이는 다음을 요청한 원래 질문에 대한 답변입니다.
빈 줄 하나를 내용 두 줄로 바꾸는 방법은 무엇입니까?
이것은 "카멜레온" 질문에 대한 답이 아닙니다.
sed '/^$/{i\
% ghi\
%
d
}'
sed
빈 줄이 발견 되면 " % ghi
", " %
" 두 줄을 삽입한 후 빈 줄을 삭제합니다.
댓글에서
그러면 구문 오류가 발생합니다.
조개껍데기 대신 진짜 조개껍데기를 사용하면 장기적으로 모든 사람의 슬픔을 덜 수 있습니다. sed -f sed.script
C 셸에서 이 작업을 수행하는 다른 방법이 있을 수 있지만 다음과 같이 작동합니다 .
echo '/^$/{\' > sed.script
echo '% ghi\' >> sed.script
echo '%' >> sed.script
echo 'd' >> sed.script
echo '}' >> sed.script
sed -f sed.script data.file
rm -f sed.script
답변4
sed -e1\!b -e:n -e"/^$/c$(printf '\\\n%%%s' \ ghi '')" -en\;bn
sed
표준 출력에 스크립트된 고정 문자열을 작성하기 위한 세 가지 기본 요소를 이해합니다. 세 가지 모두 스크립트에서 백슬래시로 이스케이프된 줄 바꿈 바로 다음에서 시작하고 스크립트에서 이스케이프되지 않은 줄 바꿈이 처음 나타나는 곳이나 스크립트에서 처음 나타나는 파일의 끝에서 끝납니다.
i
i
표준 출력에 고정 문자열 삽입지금
a
a
다음 라인 사이클 이전에 스크립트가 발생하는 순서대로 또는 마지막 라인의 경우 이 라인의 끝에 고정 문자열이 stdout에 추가되도록 정렬합니다.
c
- 모든 주소의 패턴 공간 삭제
(1(,2)?)?
, 현재 라인 사이클을 종료하고c
모든 주소의 마지막 고정 문자열 [es]에 대한 출력을 일시 중지합니다.
- 모든 주소의 패턴 공간 삭제
printf '\n\n\n\n\n' |
sed -e1\!b -e:n \
-e"/^$/c$(printf '\\\n%%%s' \ ghi '')" \
-en\;bn
% 지리 %
따라서 이 스크립트는 b
st가 아닌 모든 줄에 대해 스크립트를 확장하지만 첫 번째 줄부터 시작하여 빈 줄을 고정 문자열에 연결할 수 있을 때까지 비어 있지 않은 모든 줄을 ext로 덮어쓰기 전에 자동으로 인쇄하고 다시 루프로 돌아갑니다. 다시 수행하려면 ext 태그를 사용하세요.!
1
c
n
:n