Substituir o novo caractere de linha entre duas cadeias de caracteres

2

Eu tenho problema e vejo sua resposta em uma das questões adequadas a uma exceção

Aqui está o que eu estou tentando alcançar \ n (caractere de nova linha) deve ser substituído por branco quando \ n estiver entre duas \" strings, mas com uma exceção que se eu encontrar | antes de outro \" nada deverá acontecer.

Abaixo estão os meus exemplos de input \ output

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

para o qual se eu estou executando o comando abaixo que é quase bom para Input1, mas não acertando para Input2

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

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

Em ambas as entradas acima, depois de "data" há um retorno de carro, isto é, o texto "data" seguido está na próxima linha, mas neste post eu não consigo vê-lo na próxima linha. Por favor, ajude a ajustar este comando.

    
por ranjan 17.10.2014 / 15:08

1 resposta

1

Você pode experimentar o one-liner abaixo Perl.

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

Exemplo:

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

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

test \" data
keep| this line\" here

Explicação:

(                        group and capture to :
  \                       '\'
  "                        '"'
  (?:                      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 
\n                       '\n' (newline)
(                        group and capture to :
  (?:                      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 
    
por 17.10.2014 / 16:40

Tags