如何用Grep匹配西里尔字符并输出对应ID行至文件
解决方法:匹配西里尔字符并输出对应ID行
你的需求是当文件中存在西里尔字符时,提取该文件里对应的ID:开头的行,对吧?这里有两种实用的方法,适配你的场景:
方法1:基于grep的组合命令
如果包含西里尔字符的内容和ID行在同一个文件里(不管位置关系),可以用grep先定位目标文件,再提取ID行:
grep -i -r --include=*.{rdf,redif,rdf~} -l -P '[\x{0400}-\x{04FF}]' | xargs grep 'ID: .*' > cyrillic_ids.txt
拆解下命令逻辑:
- 前半段
grep -i -r --include=*.{rdf,redif,rdf~} -l -P '[\x{0400}-\x{04FF}]':-l参数会只输出包含西里尔字符的文件名,而非匹配到的具体行 - 管道
|把这些文件名传给xargs grep 'ID: .*':在筛选出的文件里提取所有以ID:开头的完整行,输出到目标文件
如果ID行和西里尔字符行是同一条记录里的相邻行(比如Title行之后就是ID行),还可以用上下文匹配简化:
grep -i -r --include=*.{rdf,redif,rdf~} -A1 -P '[\x{0400}-\x{04FF}]' | grep 'ID:' > cyrillic_ids.txt
-A1表示输出匹配行以及后面1行,再过滤出ID行即可。
方法2:用awk精准关联记录
如果你的文件是每条记录包含Author、Title、ID的结构化内容,awk能更精准地关联西里尔字符和对应ID:
awk '/[\x{0400}-\x{04FF}]/ {mark=1} /ID:/ && mark {print; mark=0}' *.{rdf,redif,rdf~} > cyrillic_ids.txt
需要递归处理子目录文件的话,结合find使用:
find . -type f \( -name "*.rdf" -o -name "*.redif" -o -name "*.rdf~" \) | xargs awk '/[\x{0400}-\x{04FF}]/ {mark=1} /ID:/ && mark {print; mark=0}' > cyrillic_ids.txt
逻辑说明:
- 当扫描到包含西里尔字符的行时,设置标记
mark=1 - 当遇到
ID:行且标记为1时,打印该行,然后重置标记(避免同一文件内多个ID被误匹配)
小提示
- 如果你用的是macOS默认grep,可能不支持
-P参数,建议通过Homebrew安装ggrep替代原生grep - 如果ID格式不是纯数字(比如包含字母),把正则改成
ID: .*就能匹配完整的ID行
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

