如何将变量添加到 grep -P regex 环顾四周?
How do you add a variable to a grep -P regex lookaround?
我正在尝试在 bash 中创建一个 text-based 游戏,我需要我的脚本来查看文件并使用定界符和正则表达式环视在终端上显示特定部分。一个小问题是我今年才开始学习 bash 所以我的编码效率仍然不是很高;所以为粗鲁道歉。我的问题如下:
这是我要搜索的文件的修改片段:
"MENU>2>8"
{
\e[1m\e[33m1\e[21m \e[37m- \e[33mOption one.
\n\e[1m2\e[21m \e[37m- \e[33mOption two.
\n\e[1m3\e[21m \e[37m- \e[33mOption three.
}
标题是我在引用里面grep的,后面第一个数字是菜单号因为有多个(赋值给变量$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.
颜色和格式正确。
我希望有人能帮我解决这个问题,因为我真的很感兴趣 bash;但这让我很烦。 Internet 上的正则表达式帮助页面充满了技术语言,让我感到困惑,这让我更加厌烦。
EDIT
感谢 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)
我正在尝试在 bash 中创建一个 text-based 游戏,我需要我的脚本来查看文件并使用定界符和正则表达式环视在终端上显示特定部分。一个小问题是我今年才开始学习 bash 所以我的编码效率仍然不是很高;所以为粗鲁道歉。我的问题如下:
这是我要搜索的文件的修改片段:
"MENU>2>8"
{
\e[1m\e[33m1\e[21m \e[37m- \e[33mOption one.
\n\e[1m2\e[21m \e[37m- \e[33mOption two.
\n\e[1m3\e[21m \e[37m- \e[33mOption three.
}
标题是我在引用里面grep的,后面第一个数字是菜单号因为有多个(赋值给变量$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.
颜色和格式正确。
我希望有人能帮我解决这个问题,因为我真的很感兴趣 bash;但这让我很烦。 Internet 上的正则表达式帮助页面充满了技术语言,让我感到困惑,这让我更加厌烦。
EDIT
感谢 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)