如何用grep/sed/awk优化bash查词函数defword实现分区段取释义
优化后的defword函数实现
defword() { # 拉取并预处理原始释义内容 local raw_content raw_content=$(lynx -dump "http://www.google.com/search?hl=en&q=define%3A+${1}&btnG=Google+Search" | \ grep -v "\[1\] Google" | grep -v "define: ${1}__" | grep -v "\[2\]IMAGES") # 兼容旧用法:无第二个参数或第二个参数为数字时,输出前N行内容 if [ -z "$2" ] || [[ "$2" =~ ^[0-9]+$ ]]; then local header=${2:-30} echo "$raw_content" | head -"$header" return 0 fi local section="$2" local entry_idx="$3" # 维基百科区段抓取逻辑 if [ "$section" = "wikipedia" ]; then echo "$raw_content" | awk ' /Wikipedia/ { in_wiki=1; print; next } in_wiki { if ($0 ~ /^ *$/) exit print }' return 0 fi # 词性(noun/verb等)区段抓取逻辑 echo "$raw_content" | awk -v sec="$section" -v idx="$entry_idx" ' BEGIN { IGNORECASE=1 } $0 ~ "^ *"sec { in_sec=1; print; next } in_sec { if ($0 ~ /^ *$/) exit if (idx != "") { if ($0 ~ /^ *[0-9]+\./) { count++ if (count == idx) { print exit } } } else { print } }' }
使用说明
- 输出完整名词释义:执行
defword dog noun,会打印从noun开头到下一个空行前的全部名词区段内容 - 输出指定序号的词性释义:执行
defword dog noun 2,仅打印名词区段的第2条释义,动词、形容词等其他词性的用法完全一致 - 输出维基百科释义:执行
defword dog wikipedia,会打印对应单词的维基百科释义片段 - 兼容原有使用逻辑:执行
defword dog默认输出前30行内容,执行defword dog 50输出前50行内容
内容的提问来源于stack exchange,提问作者YorSubs
相关产品推荐
相关产品推荐

