如何让 sed 命令仅搜索完整的单词?

如何让 sed 命令仅搜索完整的单词?

我对 Linux 相当陌生,最近开始尝试命令行。我决定创建一个文件并将其命名为“hi.txt”。该文件的内容是:

This is hi.txt.
hi 
hi
hi

我使用该命令sed -i 's/hi/hotel/g' hi.txt是希望将文档中的所有“hi”更改为“hotel”。这是输出:

Thotels is hotel.txt
hotel
hotel
hotel 

正如您所看到的,“hi”一词“This”也发生了变化。有没有办法阻止这种情况发生?

答案1

s///命令期望“搜索”参数是正则表达式。大多数版本都sed应该支持\b匹配,即单词与非单词或单词边缘边界处的零宽度匹配。在这种情况下,“单词”被定义为字母、数字或下划线 ( ) 的字符_。例如,如果我们假设该字符串c++在文件中单独占一行,\b则将在以下位置匹配:

  1. 就在 之前c
  2. c和第一个之间+
  3. 紧接着最后一个+

以下命令应该会为您提供所需的结果:

sed -i 's/\bhi\b/hotel/g' hi.txt

该单词this将无法匹配,因为 theh前面是单词字符 ( t),而 thei后面是单词字符 ( s)。但是,该字符串This is hi.txt将在 的第二个实例上匹配hi,因为周围的空格 和.都是非单词字符。

答案2

$ sed -e 's/\([^[:alnum:]_.-]\)hi\([^[:alnum:]_.-]\)/\1hotel\2/g' -e 's/^hi$/hotel/' <file
This is hi.txt.
hotel
hotel
hotel

相关内容