为什么awk不从行中间删除BOM表?

为什么awk不从行中间删除BOM表?,awk,unicode,grep,byte-order-mark,Awk,Unicode,Grep,Byte Order Mark,我尝试使用awk从文件中删除所有字节顺序标记(我有很多): 它似乎去除了线开始时的所有BOM,但是中间的BOM没有被移除。我可以通过以下方式进行验证: grep -U $'\xEF\xBB\xBF' f2.txt GRIP返回一条BoM在中间的行。< P> >代码>子()(代码)>只交换最左边的子串,因此如果Global是您所使用的,则使用 GSUBER()/代码>,或者更好的是 GANSUBE()/是走的路。 sub(regexp,replacement[,target]) 搜索目标,将其

我尝试使用awk从文件中删除所有字节顺序标记(我有很多):

它似乎去除了线开始时的所有BOM,但是中间的BOM没有被移除。我可以通过以下方式进行验证:

grep -U $'\xEF\xBB\xBF' f2.txt

GRIP返回一条BoM在中间的行。

< P> >代码>子()(代码)>只交换最左边的子串,因此如果Global是您所使用的,则使用<代码> GSUBER()/代码>,或者更好的是<代码> GANSUBE()/<代码>是走的路。

sub(regexp,replacement[,target])

搜索目标,将其视为字符串,搜索最左边、最长的 由正则表达式regexp匹配的子字符串。修改整个 通过替换匹配的文本来替换字符串。修改的 字符串成为目标的新值。返回 替换(零或一)

gsub(regexp,replacement[,target])

搜索所有最长、最左侧、不重叠的目标 它可以找到匹配的子字符串并用替换替换它们。这个
gsub()中的“g”代表“global”,意思是到处替换

gensub(regexp,replacement,how[,target])。

在目标字符串目标中搜索正则表达式的匹配项 regexp。如果字符串以“g”或“g”(缩写为 “全局”),然后将所有匹配的regexp替换为replacement。 否则,“how”将被视为一个数字,指示regexp的哪个匹配项 取代
gensub()
是一个通用的替换函数。其目的是提供比标准的
sub()
gsub()
函数更多的功能

下面链接了更多有用的信息和示例:


我唯一想到的是,一个记录中有多个BOM表,
sub
只删除第一个BOM表。使用
gsub
很容易验证。gsub确实解决了这个问题,但是我仍然不明白为什么。子字符串不是用另一个指定的子字符串替换指定子字符串的每个匹配项吗?不,它只替换每个记录中的第一个匹配项。
grep -U $'\xEF\xBB\xBF' f2.txt