匹配带有/不带有尾随空格的单词有什么区别?

匹配带有/不带有尾随空格的单词有什么区别?

我正在学习 shell 脚本,为此我正在使用 HackerRank。sed同一个网站上有一个相关的问题:“Sed”命令#1:

对于给定输入文件中的每一行,将第一次出现的单词“the”转换为“this”。搜索和转换应严格区分大小写。

首先我尝试过,

sed 's/the/this/'

但在该示例测试用例中失败了。然后我尝试了

sed 's/the /this /'

它起作用了。那么,问题来了,空白造成了什么差异?我在这里错过了什么吗?

答案1

这是一种廉价且容易出错的方法词匹配

请注意,the后面带有空格与单词不匹配thereby,因此后面带有空格的匹配the可以避免在单词开头匹配该字符串。然而,它仍然匹配bathe(如果后跟空格),并且确实如此不是匹配the在一行的末尾。

要正确匹配单词the(或任何其他单词),您不应在单词周围使用空格,因为这会阻止您在行首或行尾匹配它,或者如果它两侧有任何其他非单词字符,例如例如,任何标点符号或制表符。

相反,使用零宽度字边界模式:

sed 's/\<the\>/this/'

and\<匹配\>单词前后的边界,即 a 之间的空格单词字符和一个非单词字符。单词字符通常是任何匹配的字符[[:alnum:]_](或[A-Za-z0-9_]在 POSIX 语言环境中)。

对于 GNU sed,您还可以使用\b代替\<\>

sed 's/\bthe\b/this/'

答案2

区别the在于输入文本后面是否有空格。
例如:

一个没有空格的句子,无替换:

$ echo 'theman' | sed 's/the /this /'
theman

带有空格的句子,按预期工作:

$ echo 'the man' | sed 's/the /this /'
this man

带有另一个空白字符的句子,不会发生替换:

$ echo -e 'the\tman' | sed 's/the /this /'
the     man

答案3

sed 使用正则表达式。使用时,您只需在匹配模式的一部分sed 's/the /this /'后面留出空格即可。the

使用sed 's/the/this/'您可以将所有出现的 替换为 ,the无论this后面是否存在空格the

在 HackerRank 练习中,结果是相同的,因为将 the 替换为 this 是合乎逻辑的...您仅替换一个代词,默认情况下后跟空格(语法规则)。

the例如,如果您尝试将单词大写,您可以看到差异the theater

echo 'the theater' |sed 's/the /THE /g'
THE theater                              
#theater is ignored since the is not followed by space

echo 'the theater' |sed 's/the/THE/g'
THE THEater
#both the are capitalized.

相关内容