我正在学习shell脚本,为此我正在使用HackerRank。sed
在同一站点上有一个与之相关的问题:'Sed'命令#1:
对于给定输入文件中的每一行,用“ this”转换单词“ the”的首次出现。搜索和转换应严格区分大小写。
首先,我尝试了
sed 's/the/this/'
但是在那个示例测试案例中失败了。然后我尝试
sed 's/the /this /'
而且有效。那么,问题来了,空白产生了什么区别?我在这里想念什么吗?
我正在学习shell脚本,为此我正在使用HackerRank。sed
在同一站点上有一个与之相关的问题:'Sed'命令#1:
对于给定输入文件中的每一行,用“ this”转换单词“ the”的首次出现。搜索和转换应严格区分大小写。
首先,我尝试了
sed 's/the/this/'
但是在那个示例测试案例中失败了。然后我尝试
sed 's/the /this /'
而且有效。那么,问题来了,空白产生了什么区别?我在这里想念什么吗?
Answers:
区别在于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( |$)
如果扩展正则表达式有效,则可能更接近工作。无论如何,IDK是什么意思是“作为字符串”还是“子字符串”。在这两种情况下,它都是整行的子字符串,并且您的测试用例不足以检测"the "
失败的情况。Kusalanada的答案要好得多,我建议您接受它。
这是一种便宜且容易出错的词匹配方法。
请注意,the
在后面加上一个空格与单词不匹配thereby
,因此在后面加上一个空格the
可以避免在单词开头匹配该字符串。然而,它仍然不匹配bathe
(如果后面有一个空格),它并不能匹配the
在一行的末尾。
为了the
正确匹配单词(或其他任何单词),请勿在单词周围使用空格,因为那样会阻止您在行的开头或结尾或其他任何非单词字符(例如,例如,任何标点符号或制表符。
而是使用零宽度字边界模式:
sed 's/\<the\>/this/'
在\<
和\>
边界前,后字相匹配,即之间的空间单词字符和非单词字符。单词字符通常是任何匹配的字符[[:alnum:]_]
(或[A-Za-z0-9_]
在POSIX语言环境中)。
使用GNU sed
,您还可以\b
代替\<
和\>
:
sed 's/\bthe\b/this/'
sed可以使用正则表达式。使用sed 's/the /this /'
您只需the
在匹配模式的一部分之后留出空格。
使用sed 's/the/this/'
替换所有出现的the
,this
无论后面是否有空格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.
g
在替换文本后没有,您仅替换第一个匹配项。