我正在尝试在bash中创建基于文本的游戏,我需要脚本浏览文件,并使用定界器和Regex Lookaround在终端上显示特定的部分。一个小问题是,我今年才开始学习狂欢,所以我的编码效率仍然不太有效。因此,为粗鲁而道歉。我的问题是:
这是我想搜索的文件的修改片段:
"MENU>2>8"
{
e[1me[33m1e[21m e[37m- e[33mOption one.
ne[1m2e[21m e[37m- e[33mOption two.
ne[1m3e[21m e[37m- e[33mOption three.
}
标题是我在引号内部掌握的,第一个数字是菜单编号之后的第一个数字,因为有多个(分配给变量$MENU_NUM
),第二个数字是用于查找所述标题的字段。代码可能比我试图解释它更有意义:
TEXT=$(cat ~/Desktop/Dialogue.txt | tr "n" " ")
MENU_NUM=2
echo -en $(echo "$TEXT" | grep -Po '(?<=MENU>[^$MENU_NUM]>)[0-9]+" {.*' | grep -Po '(?<={ ).*' | grep -Po '^(.*?)}' | head -c-3)
我意识到所有管道都看起来很糟糕,但是我无法将其与一个Grep一起使用,而无需它在外观之后输出所有内容。我对它是否令人费解并不为之大惊小怪,我唯一无法工作的是变量。无论我尝试什么,它都不会读取$MENU_NUM
。我尝试了:
$MENU_NUM
^$MENU_NUM
/^$MENU_NUM/
^$MENU_NUM/
^${MENU_NUM}
和其他许多变化,但它不会读取该数字。只是为了澄清,如果我使用一个数字,它可以正常工作。例如,如果我使用:
echo -en $(echo "$TEXT" | grep -Po '(?<=MENU>2>)[0-9]+" {.*' | grep -Po '(?<={ ).*' | grep -Po '^(.*?)}' | head -c-3)
我得到:
1 - Option one.
2 - Option two.
3 - Option three.
以正确的颜色和格式。
我希望有人能帮助我解决这个问题,因为我真的很忙碌。但这让我非常烦人。互联网上的Regex帮助页面充满了技术语言,以至于我感到困惑,这使它更加令人讨厌。
编辑
感谢 chrisaycock 的帮助,我能够实质上修改我的代码。下面的结果是:
$ echo -en $(echo "$TEXT" | grep -Po ""MENU>$MENU_NUM>[0-9]+" {.*?}" | grep -Po '(?<={ ).*' | head -c-3)
1 - Option one.
2 - Option two.
3 - Option three.
就像应该一样。
现在,它现在仅使用两个GREP,并且似乎也可以与文件的其他部分一起使用。我将$TEXT
变量保留在其他部分中,因为我的脚本是必要的。再次感谢。
您不能在带有变量的bash中使用单台引用;使用双引号代替。
我不得不对您的GREP语句进行一些更改,因为我无法使其在系统上使用。这是一个使用过程替代和重定向来消除cat
或一次性使用变量的需求的示例。
echo -en $(grep -Po ""MENU>$MENU_NUM>[0-9]+" {.*" <(tr "n" " " < Dialogue.txt) | grep -Po '(?<={ ).*' | grep -Po '^(.*?)}' | head -c-3)