2

我正在尝试替换两个单引号之间所有出现的 ANY 值,包括转义的单引号。以下工作非常好,除非找到转义的单引号。这是有道理的,但有没有办法解决它。我想替换单引号之间的所有字符。

$ echo "'blah\'blah'" | perl -pe s/"'"[^"'"]*"'"/stuff/g
stuffblah'

我只想看看:

stuff
4

2 回答 2

0

在我们的引号内,我们希望允许以下标记

  1. 所有非引号字符[^']
  2. 所有转义引号\',编码为\\'or
  3. 所有转义的反斜杠\\,编码为\\\\. 我们需要这个额外的规则来表示所有可能的数据。

正则表达式中的or由管道字符 表示|,我们将这些可能的标记用括号括起来,以便对它们进行分组以进行迭代:

( \\\\ | \\' | [^'] )*

或者更清楚地显示可以逃脱的内容:

( \\[\\'] | [^'] )*

现在我们只需将其打包成引号,并使分组括号不保存(不需要$1创建变量等),我们有

s {' (?: \\[\\'] | [^'] )* '}
  {stuff}gx

请注意使用/x修饰符来包含非语义空格以提高可读性。

编辑:Perl 单行

所有单行代码都经过了测试bash。其他 shell 将显示其他引用的恐怖。在下一行中,提供了未转义的正则表达式。

这个单行匹配单引号,指定:

perl -pe"s/'(?:\\\\[\\\\']|[^'])*'/stuff/g"
         s/'(?:\\  [\\']  |[^'])*'/stuff/gx

将反斜杠加倍以适应外壳转义。

这个单行匹配双引号:

perl -pe"s/\"(?:\\\\[\\\\\"]|[^\"])*\"/stuff/g"
         s/ "(?:\\  [\\"]   |[^"] )* "/stuff/gx
于 2012-09-21T01:46:28.600 回答
0

您的问题是两个 blahs 之间只有一个单引号,因此当第一个 'blah' 被替换时,第二个 blah' 不再受单引号限制。如果您想允许转义单引号,请执行以下操作:

 s/\\?'[^']*'/stuff/g
于 2012-09-21T01:46:35.490 回答