在正则表达式中替换嵌套的反向引用

时间:2019-02-26 22:58:16

标签: regex grep nested pcre

我从Excel电子表格中提取了一个列,其中一些单元格包含多行,有些则没有。多行单元格由引号引起来。我想用“,”替换那些多行单元格中的返回值。所以我的文件看起来像这样:

"Alpha
 Beta
 Gamma"
 123
 456
"Apple
 Banana
 Cherry"
 789
 this is a single-line cell

我的目标是

 Alpha, Beta, Gamma
 123
 456
 Apple, Banana, Cherry
 789
 this is a single-line cell

我可以编写一个使用嵌套模式捕获这些多行单元格的模式,但是我不知道如何“深入”内部以获取反向引用。

"(([^"]+)\n)+([^"]+)"

2 个答案:

答案 0 :(得分:0)

使用GNU awk进行多字符RS和RT:

$ awk -v RS='"[^"]+"|[^"\n]+' '$0=RT{gsub(/^\s+|\s+$|"/,""); gsub(/\n/,","); print}' file
Alpha, Beta, Gamma
123
456
Apple, Banana, Cherry
789
this is a single-line cell

答案 1 :(得分:0)

尝试:

$ sed '/^"/{:a; /"$/bb; N; ba; :b; s/\n//g}' file
"Alpha Beta Gamma"
 123
 456
"Apple Banana Cherry"
 789
 this is a single-line cell

工作原理

  • /^"/{...}

    对于以"开头的任何行,将执行大括号中的命令。

  • :a

    这将创建标签a

  • /"$/bb

    如果当前模式空间以"结尾,则分支到标签b

  • N

    将新行读入模式空间。

  • ba

    分支回到标签a

  • :b

    这定义了标签b

  • s/\n//g

    从模式空间中删除所有换行符。