正则不区分大小写搜索化学元素单词,如何让输出匹配正则大小写?
解决方案
可以通过sed或awk工具实现需求,核心思路是先筛选出符合条件的单词,再将单词中的字符替换为对应元素符号的大小写格式。以下是两种可行方法:
方法一:使用awk实现精准匹配替换
这种方法会从左到右优先匹配最长的元素符号(避免短符号先匹配导致长符号无法匹配),替换为原元素符号的大小写格式:
- 先将元素符号按长度从长到短排序(确保双字母符号优先匹配):
awk '{print length($0), $0}' element_symbols.txt | sort -nr | cut -d' ' -f2- > sorted_elements.txt
- 结合grep筛选和awk替换:
grep -Pi "^($(paste -s -d'|' element_symbols.txt))+$" /usr/share/dict/words | awk -v elements="$(cat sorted_elements.txt)" ' BEGIN { n = split(elements, arr, "\n") for (i=1; i<=n; i++) { sym = arr[i] sym_lower = tolower(sym) map[sym_lower] = sym len = length(sym_lower) if (len > max_len) max_len = len } } { word = tolower($0) result = "" pos = 1 while (pos <= length(word)) { matched = 0 for (l=max_len; l>=1; l--) { substr_word = substr(word, pos, l) if (substr_word in map) { result = result map[substr_word] pos += l matched = 1 break } } if (!matched) break } print result } '
方法二:使用sed批量替换
通过生成按长度排序的sed替换规则,将小写单词替换为元素符号的大小写格式:
- 生成sed替换脚本(按元素符号长度从长到短排序):
awk '{print length($0), $0}' element_symbols.txt | sort -nr | cut -d' ' -f2- | awk '{print "s/"tolower($0)"/"$0"/g"}' > sed_replace.sed
- 筛选单词并替换:
grep -Pi "^($(paste -s -d'|' element_symbols.txt))+$" /usr/share/dict/words | tr '[:upper:]' '[:lower:]' | sed -f sed_replace.sed
两种方法都能将匹配到的单词(如Hershey)转换为元素符号大小写组合的格式(如HErSHeY),其中awk方法逻辑更清晰,适配复杂匹配场景的能力更强。
内容的提问来源于stack exchange,提问作者qwr
相关产品推荐
相关产品推荐

