Awk는 이스케이프된 개행 문자를 읽을 수 있나요? 즉, 과거 개행 문자를 읽습니다.

Awk는 이스케이프된 개행 문자를 읽을 수 있나요? 즉, 과거 개행 문자를 읽습니다.

내 입력은 다음과 같습니다.

entry1line1
entry2line1\
entry2line2\
entry2line3
entry3line1

이러한 입력을 AWK의 배열로 읽은 다음 포함된 개행 문자로 처리하고 싶습니다. 그게 가능합니까? GNU 기능을 사용하지 않는 것이 가장 좋습니다.

답변1

posix awk를 사용하면 getline을 사용할 수 있습니다

awk '{while(/\\$/){getline tmp;$0=$0"\n"tmp}print "<LINE>"$0"<LINE>"}' file

마지막 줄이 끝나는 한 다음 줄을 계속 추가하십시오 \.

<LINE>entry1line1<LINE>
<LINE>entry2line1\
entry2line2\
entry2line3<LINE>
<LINE>entry3line1<LINE>

Perl에서도 마찬가지입니다.

perl -ne '$_.=<> while /\\$/;chomp;print "<LINE>$_<LINE>\n"' file

답변2

GNU awk 사용:

$ awk '{printf "%s%s%s","line=",$0,RT}' RS='[^\\\\]\n' text
line=entry1line1
line=entry2line1\
entry2line2\
entry2line3
line=entry3line1

보시다시피, 로 끝나는 줄이 \다음 줄로 연결됩니다. 이 때문입니다기록 구분 기호 RS백슬래시가 아닌 문자와 개행 문자로 재정의됩니다. 즉, 백슬래시-개행 문자는 레코드 구분 기호가 아닙니다.

여기서 약간의 트릭은 레코드 구분 기호가 레코드의 마지막 문자를 차지한다는 것입니다. 그러나 캐릭터는 내장 변수에 저장됩니다 RT. 프로그램을 약간 변경하면 $0코드 시작 부분의 값이 수정되어 문제가 해결됩니다.

$ awk '{$0=$0 substr(RT,1,1)} {print "line=",$0}' RS='[^\\\\]\n' text
line= entry1line1
line= entry2line1\
entry2line2\
entry2line3
line= entry3line1

RT실제 관찰된 레코드 구분 기호 전체를 포함합니다. 우리의 경우 이는 레코드의 마지막 문자 뒤에 개행 문자가 있음을 의미합니다. 따라서 위 코드에서는 의 첫 번째 문자가 의 끝에 substr추가됩니다 .RT$0

답변3

레코드 구분자를 변경할 수 있습니다.POSIXawkRSPOSIX는 정규 표현식이 될 수 있는지 여부를 지정하지 않습니다 .

다중 문자 RS 값을 사용하는 지정되지 않은 동작은 레코드 구분 기호에 대한 확장 정규식을 기반으로 향후 가능한 확장을 허용하는 것입니다. 역사적 구현에서는 문자열의 첫 번째 문자를 취하고 다른 문자는 무시합니다.

그러나 전체 파일을 문자열로 읽거나(less를 선택하여 RS), 를 사용하고 getline, 줄 끝을 살펴보고 필요한 경우 결과를 함께 연결할 수 있습니다.

답변4

이것펄 레시피Perl을 사용하여 이를 수행하는 방법에 대한 예가 있습니다.

<>명명된 파일 핸들 대신 (stdin 및/또는 명령줄에서 인수로 제공되는 모든 파일 이름)을 사용하고 계속된 후에 개행 문자를 유지하도록 \(약간 특이한 경우) 예제를 조정했습니다 . common 연속된 행을 긴 행으로 처리하고 연속된 행이 연결되지 않거나 공백 문자로 연결되지 않는 상황입니다.

perl -e '
$count=1;
while (defined($line = <>) ) {
    chomp($line);
    if ($line =~ s/\\$//) {
        $line .= "\n" . <>;
        redo unless eof();
    }
    # process full record in $line here
    printf "%04i:\"%s\"\n\n", $count++,$line;
}' willdavies.txt 

$line댓글을 다신 후 원하시는 것은 무엇이든 하시면 됩니다 # process full record.... 나는 0으로 채워진 줄 카운터를 사용하여 각 줄을 별도의 단락으로 인쇄하기로 결정했습니다. 또한 포함된 내용 과 포함되지 않은 내용을 $line정확히 확인할 수 있도록 인용문을 추가했습니다 .$line

산출:

0001:"entry1line1"

0002:"entry2line1
entry2line2
entry2line3"

0003:"entry3line1"

관련 정보