我对 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
则将在以下位置匹配:
- 就在 之前
c
。 c
和第一个之间+
。- 紧接着最后一个
+
。
以下命令应该会为您提供所需的结果:
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