为什么没有正确解释这个正则表达式?

时间:2013-12-12 09:24:40

标签: regex bash sed

echo "This is a test string" | sed 's/This/\0/'

首先,我使用正则表达式This匹配子字符串This。然后我使用\0将第一个匹配替换为整个字符串。所以结果应该只是匹配的字符串。

但它打印出整条线。为什么会这样?

2 个答案:

答案 0 :(得分:3)

您不会将整个字符串替换为\0,只替换模式匹配,即This。换句话说,您将This替换为This

要用This替换整行,您可以执行以下操作:

echo "This is a test string" | sed '/This/s/.*/This/'

它会查找与This匹配的行,并将整行替换为This。在这种情况下(因为只有一行)你也可以这样做:

echo "This is a test string" | sed 's/.*/This/'

如果您想重复使用匹配,那么您可以

echo "This is a test string" | sed 's/.*\(This\).*/\1/'

\(\)用于记住其中的匹配。它可以被引用为\1(如果您有多对\(\),那么您也可以使用\2\3,... )。

在上面的示例中,这不是很有帮助,因为我们知道\(\)内部是单词This,但是如果我们在括号内有一个可以匹配的正则表达式不同的话,这可能非常有用。

答案 1 :(得分:0)

sed 's/.*\(PatThis\).*/PatThat/'

se '/PatThis/ s/.*/PatThat/'

在您的请求中,“PatThis”和“PatThat”包含相同的内容(“This”)。在评论中(

  

我需要使用\ d \ d \ d \ d选择一个数字,然后将其用作   替换

)你有两个不同的模式PatThis和PatThat \ 1并不是真的需要,因为你知道确切的包含(除非'PatThis'是一个带有特殊字符的正则表达式,如\&amp ;?。)