shell 从单词到字符的多行选择

shell multiline selection from word to character

.textexpandrc

[yoro] よろしくお願いします。
[ohayo] おはようございます。
元気ですか?
[otsu] お疲れさまでします。

正在寻找

$ KEY=ohayo; awk "???"  ~/.textexpandrc 
おはようございます。
元気ですか?

awk 或 sed 很好,但我想避免混合使用 awk/sed/perl/tr/cut 等,因为我的印象是 awk 足够强大,可以自行处理。

我自己能找到的最好的是

$ KEY=ohayo; awk "/\[${KEY}/,/\[otsu/"  ~/.textexpandrc | sed "s/\[${KEY}\] //" | grep -v otsu
おはようございます。
元気ですか?

但我需要提前知道下一个密钥(不是不可能,但很难看)。奇怪的是,如果要求 awk 搜索到方括号,它无法 select a multiline

$ KEY=ohayo; awk "/\[${KEY}/,/\[/"  ~/.textexpandrc                                      
[ohayo] おはようございます。

目前使用单行解析器解决方案如下

#!/usr/bin/env bash

CONFIG=${HOME}/.textexpandrc
ALL_KEYS=$(sed 's/\].*/]/' ${CONFIG} | tr -d '[]')
KEY=$(echo $ALL_KEYS | rofi -sep ' ' -dmenu -p "autocomplete")

grep "\[${KEY}\]" $CONFIG | sed "s/\[${KEY}\] //" | xsel -ib  # ← HERE
xdotool key ctrl+shift+v

如果您设置 RSFS 变量来匹配 [],则效果很好:

awk 'BEGIN{ RS="\["; FS="\] " };   ~ key { print  }' key=ohayo tmp.txt

您在命令行中使用 key=.... 传递要搜索的参数,而不是设置变量。这使得在单引号内编写 awk 脚本变得更加容易。