두 문자열 사이의 개행 문자 바꾸기

두 문자열 사이의 개행 문자 바꾸기

문제가 발생하여 한 가지 예외를 제외하고 적합한 질문 중 하나에서 귀하의 답변을 확인했습니다.

이것이 내가 달성하고 싶은 것입니다. \n이 두 \"문자열 사이에 있을 때 \n(개행 문자)을 공백으로 바꿔야 하지만 한 가지 예외를 제외하고 |다른 문자열 앞에 찾으면 \"아무 일도 일어나지 않습니다.

아래는 내 입력/출력 예제입니다.

Input 1
test \" data
get this line\" in above line

Output 1
test \" dataget this line\" in above line

Input2
test \" data
keep| this line\" here

Output 2
test \" data
keep| this line\" here

다음 명령을 실행하면 입력 1에서는 거의 작동하지만 입력 2에서는 올바른 결과가 제공되지 않습니다.

perl -pe 's/\n(?=(?:(?!\\"|\\").)*(\\"|\n|))/\1/g' input1.txt
test \" dataget this line\" in above line[sh]$

perl -pe 's/\n(?=(?:(?!\\"|\\").)*(\\"|\n|))/\1/g' input2.txt
test \" dataget this line\" in above line[sh]$

위의 두 입력에서 "data" 뒤에 캐리지 리턴이 있습니다. 즉, "data" 뒤의 텍스트가 다음 줄에 있지만 이 게시물에서는 다음 줄에서 그것을 볼 수 없습니다. 이 명령을 조정하는 데 도움을 주세요.

답변1

다음 Perl 단일 라이너를 사용해 볼 수 있습니다.

perl -00pe 's/(\\"(?:(?!\\"|\|).)*)\n((?:(?!\\"|\|).)*\\")/\1\2/g' file

예:

$ cat file
test \" data
get this line\" in above line

test \" data
keep| this line\" here
$ perl -00pe 's/(\\"(?:(?!\\"|\|).)*)\n((?:(?!\\"|\|).)*\\")/\1\2/g' file
test \" dataget this line\" in above line

test \" data
keep| this line\" here

설명하다:

(                        group and capture to \1:
  \\                       '\'
  "                        '"'
  (?:                      group, but do not capture (0 or more
                           times):
    (?!                      look ahead to see if there is not:
      \\                       '\'
      "                        '"'
     |                        OR
      \|                       '|'
    )                        end of look-ahead
    .                        any character except \n
  )*                       end of grouping
)                        end of \1
\n                       '\n' (newline)
(                        group and capture to \2:
  (?:                      group, but do not capture (0 or more
                           times):
    (?!                      look ahead to see if there is not:
      \\                       '\'
      "                        '"'
     |                        OR
      \|                       '|'
    )                        end of look-ahead
    .                        any character except \n
  )*                       end of grouping
  \\                       '\'
  "                        '"'
)                        end of \2

관련 정보