为什么grep命令对使用UTF-16 LE编码的文本文件不起作用?

时间:2019-06-14 11:05:04

标签: utf-8 grep utf-16

我想将以某些字符串开头的所有行保存在另一个文本文件中。因此,我使用了grep命令来做到这一点:

grep '^This' input.txt > output.txt

但是输出文件output.txt是空的,尽管文件input.txt中有很多行以'this'开头。我的一位导师建议文件input.txt的格式为UTF-16 LE,并要求我将其更改为UTF-8。然后该命令运行良好。

为什么grep命令不能用于UTF-16 LE格式的文件?

2 个答案:

答案 0 :(得分:3)

app.get("/api/find/hindi/:find",function(request, response) { let db = new sqlite3.Database("./quranDb.db",(err) => { if (err){ console.log("Not connected to sqlite") } else{ console.log("Connected to sqlite") } }); response.writeHead(200, {"Content-Type": "text/html; charset=utf-8"}); let sql = `SELECT Surat_ID, Ayat_ID, Surat_Name, Hindi FROM QuranTest`; db.all(sql, [], (err, rows) => { if (err) { throw err; } rows.forEach((row) => { ayats.push(JSON.stringify({Translation: row.Hindi,SuratName: row.Surat_Name,SuratID: row.Surat_ID,AyatNo: row.Ayat_ID})); }); //console.log(ayats); Translation=""; Surat_No=""; Surah_Name=""; Ayat_No=""; try { ayats.forEach(function(element) { if (element.toLowerCase().includes(request.params.find.toLowerCase())===true) { counting++; element=JSON.parse(element); Surah_Name = element.SuratName; Ayat_No = element.AyatNo; Surah_No = element.SuratID Translation = "In Surah "+ element.SuratName+", Ayat Number: "+element.AyatNo+", Quran says: "+ element.Translation; const tempObj={ Surah_No, Surah_Name, Ayat_No, Translation } parentObj[`result_${counting}`]=tempObj } if (counting===10){ throw BreakException } }) } catch(e) { if (e!==BreakException) throw e } if (counting ===0){ response.write(JSON.stringify({"speech":"No results found"}),"utf-8") } else{ response.write(JSON.stringify(parentObj),"utf-8") } response.send(); counting = 0; parentObj={}; }); empty(); function empty() { ayats.length = 0; } db.close((err) => { if (err) { return console.error(err.message); } console.log('Close the database connection.'); }); }) 不支持编码。它不搜索“字符”,而是搜索字节。您的控制台正在将UTF-8 / ASCII编码的文本(在这种情况下,字符串“ ^ This”相同)发送到grep进行搜索。如果文件包含UTF-16编码的文本,则该文本将不匹配,因为字节表示形式是不同的。

答案 1 :(得分:0)

Deceze的答案是正确的。但是有一点不同:grep确实可以识别您的语言环境设置,例如当您的环境语言环境通过export LANG=en_US.UTF-8设置为UTF-8时,它将与UTF-8模式匹配。但是,grep不支持UTF-16。您需要先将UTF-16转换为UTF-8,如下所示:

iconv -f UTF-16 -t UTF-8 < input.txt | grep '^This' > output.txt

如果您经常遇到此问题,那么我建议您使用完全支持UTF编码的grep替换。例如,ugrep支持通用的GNU / BSD grep命令行选项。其他选择是ripgrep,ack,silver searcher(ag)。但是,这些工具并不是grep的真正替代品,因为它们的行为和命令行选项与grep不同。