如何找到不匹配的文本定界符

时间:2019-05-08 11:02:43

标签: regex perl sed

我正试图删除出现在dB字符串中的双引号,因为它在另一个应用程序中导致流错误。我无法清理dB来删除这些字符,因此我需要即时替换字符。

我尝试使用sed,ssed和perl都没有成功。这个正则表达式可以找到问题的引号,但是当我将其插入sed并将其替换为单引号时,我的输出仍然包含双引号。

sed "s/(\?<\!\t|^)\"(\?\!\t|$)/'/g" test.txt 

我在Mac上,如果看起来有点奇怪。

正则表达式有效,但是当我在包含以下内容的制表符分隔文件中进行测试时:

"foo"   "rea"son"   "text's"

我的输出与以上相同。知道我在做什么错吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我假设您希望将不在字段边界上的所有"(例如,制表符或字符串的开头/结尾之前或之后)都用'进行翻转。

这可以使用perl和以下替换来完成:

s/(?<=[^\t])"(?=[^\t\n])/'/g;

(使用sed,这是直接不可能的,因为它不支持先行式/先行式断言。)

要在命令行上使用此代码,无论您使用什么外壳,都需要对其进行转义。假设bash或类似的sh-like shell:

perl -pe 's/(?<=[^\t])"(?=[^\t\n])/'\''/g' test.txt

在这里,我使用'...'引用大部分代码。为了使单引号'进入带引号的字符串,我离开引号区域...',添加转义的单引号\',然后切换回单引号的字符串'... 。这就是为什么文字'在命令行上变成'\''的原因。