문제가 발생하여 한 가지 예외를 제외하고 적합한 질문 중 하나에서 귀하의 답변을 확인했습니다.
이것이 내가 달성하고 싶은 것입니다. \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