我遇到问题,并在适合的问题之一中看到您的答案,但有一个例外
这是我想要实现的目标,当 \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