我想将以某些字符串开头的所有行保存在另一个文本文件中。因此,我使用了grep
命令来做到这一点:
grep '^This' input.txt > output.txt
但是输出文件output.txt
是空的,尽管文件input.txt
中有很多行以'this'开头。我的一位导师建议文件input.txt
的格式为UTF-16 LE
,并要求我将其更改为UTF-8
。然后该命令运行良好。
为什么grep命令不能用于UTF-16 LE
格式的文件?
答案 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不同。