有/无尾随空格匹配一个单词有什么区别?


12

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

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

首先,我尝试了

sed 's/the/this/'

但是在那个示例测试案例中失败了。然后我尝试

sed 's/the /this /'

而且有效。那么,问题来了,空白产生了什么区别?我在这里想念什么吗?


我认为第一个版本也“有效”,但不符合您的预期。它应该替换了字母序列“ the”的第一次出现,但是您可能已经看过单词“ the”的第一次出现。
Dubu

好吧,在本文中,是的,实际上,是的。
Rolf

Answers:


7

区别在于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

我错过了。我必须将“ the”作为字符串。不是子字符串。
JHA

1
@JHA:行尾也很重要。例如,单词“ the”可能出现在行尾,作为带有换行符的文件的一部分,但仍位于段落的中间,因此仍然是英语句子中的普通单词。 the( |$)如果扩展正则表达式有效,则可能更接近工作。无论如何,IDK是什么意思是“作为字符串”还是“子字符串”。在这两种情况下,它都是整行的子字符串,并且您的测试用例不足以检测"the "失败的情况。Kusalanada的答案要好得多,我建议您接受它。
彼得·科德斯

20

这是一种便宜且容易出错的词匹配方法

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

为了the正确匹配单词(或其他任何单词),请勿在单词周围使用空格,因为那样会阻止您在行的开头或结尾或其他任何非单词字符(例如,例如,任何标点符号或制表符。

而是使用零宽度字边界模式:

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

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

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

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

7

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

使用sed 's/the/this/'替换所有出现的thethis无论后面是否有空格the

在HackerRank练习中,结果是相同的,因为用替换这是合乎逻辑的……您只替换了一个亲名词,默认情况下它是空格(语法规则)。

如果尝试例如大写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.

谢谢你的回答。感激的:)
JHA

“您替换所有匹配项”要明确:g在替换文本后没有,您仅替换第一个匹配项。
Dubu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.