替换两个字符串之间的换行符

替换两个字符串之间的换行符

我遇到问题,并在适合的问题之一中看到您的答案,但有一个例外

这是我想要实现的目标,当 \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]$

在上面的两个输入中,“数据”之后有一个回车符,即“数据”后面的文本位于下一行,但在这篇文章中我无法在下一行中看到它。请帮助调整这个命令。

答案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

相关内容