我有一个超过 300 万行的文本文件,并且在某处有不平衡的引用。我们怎样才能找到不平衡的报价" "
呢?
答案1
awk -F\" 'NF%2==0 { print NR;; }' inputfile
给出所有具有奇数 的行数"
。
答案2
仅供参考,当引号可以转义时找到平衡的引号字符串\"
可能会变得相当复杂得到完全正确的结果,这使得速度变慢:
(?<=^|[^\\])(?:\\\\)*("((?:[^\n\\"]|\\.)*+)"|'((?:[^\n'])*+)')
但是,如果您只关心一种类型的引号( ),单引号内"
没有双引号,并且双引号()没有转义,那么问题就变得非常简单,为了速度,可以用一个简单的方法来解决并快速和管道获取双引号数量不为偶数(奇数)的行号:"
'"'
\"
tr
grep
➤ tr -cd '"\n' <file | grep -nxE '("")+"'
15:"""
16:"""
答案3
这个 awk 将找到任何带有奇数个引号的行,并打印文件名、行号和前 80 个字符。
awk '
BEGIN { DQ = "\042"; fmt = "%s:%d:%.80s\n"; }
gsub (DQ, DQ) % 2 { printf (fmt, FILENAME, FNR, $0); }
' file1 file2 ...
根据内容的语法,这可能会引发一些误报,因此请使用行号与编辑器进行检查以查找特定记录。
两个或多个紧密相连可能表示允许多行引用数据的语法,例如数据中嵌入换行符的 CSV 字段。
扩展为报告不匹配的单引号和双引号:
awk '
BEGIN { DQ = "\042"; SQ = "\047"; fmt = "%s:%d:%.80s\n"; }
gsub (DQ, DQ) % 2 || gsub (SQ, SQ) % 2 { printf (fmt, FILENAME, FNR, $0); }
' file1 file2 ...