我正在学习 shell 脚本,为此我正在使用 HackerRank。sed
在同一个站点上有一个问题: 'Sed' command #1:
对于给定输入文件中的每一行,将单词“the”的第一次出现转换为“this”。搜索和转换应严格区分大小写。
首先我试过了,
sed 's/the/this/'
但在那个示例测试用例中失败了。然后我尝试了
sed 's/the /this /'
它奏效了。那么问题来了,空格产生了什么区别?我在这里错过了什么吗?
我正在学习 shell 脚本,为此我正在使用 HackerRank。sed
在同一个站点上有一个问题: 'Sed' command #1:
对于给定输入文件中的每一行,将单词“the”的第一次出现转换为“this”。搜索和转换应严格区分大小写。
首先我试过了,
sed 's/the/this/'
但在那个示例测试用例中失败了。然后我尝试了
sed 's/the /this /'
它奏效了。那么问题来了,空格产生了什么区别?我在这里错过了什么吗?
这是一种廉价且容易出错的单词匹配方式。
请注意,
the
它后面的空格与单词不匹配thereby
,因此与后面的空格the
匹配可以避免匹配单词开头的字符串。但是,它仍然匹配(bathe
如果后跟空格),并且在行尾不匹配。the
要正确匹配单词
the
(或任何其他单词),您不应在单词周围使用空格,因为这会阻止您在行首或行尾匹配它,或者它的两侧有任何其他非单词字符,例如例如,任何标点符号或制表符。相反,使用零宽度字边界模式:
\<
and\>
匹配单词前后的边界,即单词字符和非单词字符之间的空格。单词字符通常是任何匹配的字符[[:alnum:]_]
(或[A-Za-z0-9_]
在 POSIX 语言环境中)。使用 GNU
sed
,您还可以使用and\b
代替:\<
\>
the
区别在于输入文本后面是否有空格。例如:
没有空格的句子,没有替换:
使用带空格的句子,按预期工作:
对于带有另一个空格字符的句子,不会发生替换:
sed 适用于正则表达式。使用您只需在匹配模式的一部分
sed 's/the /this /'
之后留出空格。the
无论 . 之后是否存在空格,使用您替换
sed 's/the/this/'
所有出现的。the
this
the
在 HackerRank 练习中,结果是相同的,因为用 this 替换 the 是合乎逻辑的……您只需替换默认情况下后跟空格的代词(语法规则)。
例如,如果您尝试
the
将单词大写,您会看到不同之处the theater
: