从单词到字符的多行外壳选择

时间:2018-10-06 12:22:05

标签: regex bash awk multiline

.textexpandrc

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

寻找

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

awk或sed很好,但我想避免同时使用awk / sed / perl / tr / cut等,因为我觉得awk足够强大,可以自行处理。 / p>

我自己能找到的最好的是

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

但是我需要提前知道下一个键(不是不可能,但是很丑)。奇怪的是,如果要求awk搜索直到方括号,它将无法选择多行

$ 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

1 个答案:

答案 0 :(得分:3)

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

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

您可以在命令行上使用key=....而不是设置变量来传递要搜索的参数。这样可以更轻松地在单引号中编写awk脚本。