다음 줄의 첫 번째 문자를 기준으로 줄을 연결합니다.

다음 줄의 첫 번째 문자를 기준으로 줄을 연결합니다.

다음 라인을 기준으로 원정 연락처 라인을 찾고 있습니다. 지금까지 본 유일한 방법은 한 줄씩 읽고 다음을 수행하는 쉘 스크립트를 만드는 것입니다.

while read line
    if $line does not start with "," and $curr_line is empty 
        store line in curr_line
    if $line does not start with "," and $curr_line is not empty
        flush $curr_line to file
        store $line in $curr_line
    if $line starts with "," append to $curr_file, flush to file empty curr_line
done < file

그래서 저는 이것이 sed나 grep 및 리디렉션을 사용하여 달성될 수 있는지 이해하려고 노력하고 있습니다. 이 파일의 규칙은 간단합니다. ","로 시작하는 최대 한 줄만 이전 줄에 추가하면 됩니다.

전임자:

line0
line1
line2
,line3
line4
line5
,line6
line7
,line8
line9
line10
line11

결과 파일은 다음과 같습니다

line0
line1
line2,line3
line4
line5,line6
line7,line8
line9
line10
line11

답변1

나는 그것을 할 것이다:

awk -v ORS= '
  NR>1 && !/,/ {print "\n"}
  {print}
  END {if (NR) print "\n"}' < file

즉, 현재 줄이 다음으로 시작하지 않으면 이전 줄을 구분하는 개행 문자만 인쇄됩니다 ,.

어떤 경우 에라도,while read루프를 사용하는 방법을 모르겠습니다..

답변2

sed이는 에 설명된 대로 전형적인 사용 사례입니다 .Sed 한 줄 설명, 1부: 파일 간격, 번호 매기기, 텍스트 변환 및 교체,40. 이전 줄이 등호 "="로 시작하는 경우 이전 줄 뒤에 줄을 추가합니다.,(에 대한 명백한 수정 사항 =)

sed -e :a -e '$!N;s/\n,/,/;ta' -e 'P;D' file
line0
line1
line2,line3
line4
line5,line6
line7,line8
line9
line10
line11

답변3

당신이 해야 할 일은 파일을 읽고 쉼표 앞의 모든 줄 바꿈을 제거하는 것입니다.

$ perl -0777pe 's/\n,/,/g' file
line0
line1
line2,line3
line4
line5,line6
line7,line8
line9
line10
line11

답변4

이것은완벽한사용 사례 ex.

들어본 적이 없다면 exYES의 전신은 vi다음과 같습니다 vi.POSIX에 의해 지정됨그리고 기본적으로 어디에서나 *사용 가능*합니다.

ex실제로 파일용으로 설계됨편집하다이지만 변경 사항을 저장하지 않고 사용할 수도 있습니다.


파일에 저장하지 않고 변경 사항 인쇄:

printf '%s\n' 'g/^,/-j!' %p | ex file.txt

변경하고 파일에 저장합니다.

printf '%s\n' 'g/^,/-j!' x | ex file.txt

설명하다:

저는 이 printf명령을 스크립트 파일 편집에 대한 래퍼로 사용합니다 ex. 이 형식의 장점은 실패 시(예를 들어 전달한 명령이 실제 명령이 아니거나 존재하지 않는 줄 번호를 지정하려고 시도하는 경우) 명령이 종료되는 대신(변경 사항을 저장하지 않고) 종료된다는 것입니다. 추가 입력을 기다리고 있습니다.

명령 자체를 실행하면 전달된 정확한 명령을 볼 수 있습니다 printf.exprintf

$ printf '%s\n' 'g/^,/-j!' %p
g/^,/-j!
%p

좋아요, 이 명령은 무엇을 합니까?

"전역" 명령 은 정규식 (줄 시작 다음에 쉼표가옴)과 g일치하는 "버퍼"(파일)의 모든 줄에서 다음 명령을 실행합니다 .^,

이 예의 명령은 주소입니다 -j!. -이는 해당 주소에서 다음 명령을 실행한다는 의미입니다.더 일찍현재 줄로 이동합니다. (즉, 이 라인에서는앞으로쉼표로 시작하는 줄. )

j"결합"에 사용되며 이 행을 다음 행과 결합합니다. 느낌표( !)는 원래 줄과 연결된 줄을 구분하기 위해 공백 문자를 사용할 수 없도록 합니다.

%는 "전체 버퍼"를 의미하는 주소 p이며 "인쇄"를 의미합니다.

x변경 사항을 저장하고 종료함을 나타냅니다.

내가 말했듯이, 이것은완벽한사용 사례 ex


*윈도우 제외. :피

관련 정보