我正在学习 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.