sed 명령은 빈 줄을 두 줄의 내용으로 바꿉니다.

sed 명령은 빈 줄을 두 줄의 내용으로 바꿉니다.

첫 번째 빈 줄을 두 줄의 내용으로 바꾸는 방법은 무엇입니까? 문제가 있는 것 같아요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.scriptC 셸에서 이 작업을 수행하는 다른 방법이 있을 수 있지만 다음과 같이 작동합니다 .

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

% 지리
%




따라서 이 스크립트는 bst가 아닌 모든 줄에 대해 스크립트를 확장하지만 첫 번째 줄부터 시작하여 빈 줄을 고정 문자열에 연결할 수 있을 때까지 비어 있지 않은 모든 줄을 ext로 덮어쓰기 전에 자동으로 인쇄하고 다시 루프로 돌아갑니다. 다시 수행하려면 ext 태그를 사용하세요.!1cn:n

관련 정보