我正在尝试使用
sed
提取(但不包括)两个匹配模式之间的字符串。我的问题是在将正则表达式乘数与 sed 命令结合使用的情况下
举个例子,
PAYPAL *SPRINGER TXTBK ORD
来自1139 "PAYPAL *SPRINGER TXTBK ORD 11/11 P
如果可能的话,我想了解为什么使用乘数的代码不起作用。
仅供参考,我使用的是在 Microsoft WSL2 上运行的 Ubuntu 22.04.2 LTS
作为测试,我尝试了以下,这是成功的:
# Code:
echo '1139 "PAYPAL *SPRINGER TXTBK ORD 11/11 P' | sed 's/^.*\"\(.* \) *[0-9][0-9]\/.*/
\1/'
# Output:
PAYPAL *SPRINGER TXTBK ORD
但是,我无法使用乘数成功地产生相同的结果。而不是上面的代码,我试过:
# Attempted Code:
echo '1139 "PAYPAL *SPRINGER TXTBK ORD 11/11 P' | sed 's/^.*\"\(.* \) *[0-9]{2}\/.*/
\1/'
# Output:
1139 "PAYPAL *SPRINGER TXTBK ORD 11/11 P
我试图理解为什么使用“乘数”来表示数字
[0-9]
应该在正斜杠之前出现两次是行不通的——即上面 [0-9]{2}
命令的 sed
部分。
经过深思熟虑,我发现我需要转义大括号
{
和}
,这样sed
命令看起来像这样:
# Command:
echo '1139 "PAYPAL *SPRINGER TXTBK ORD 11/11 P' | sed 's/^.*\"\(.* \) *[0-9]\{2\}\/[0-9]\{2\}.*/\1/'
# Output:
PAYPAL *SPRINGER TXTBK ORD
注意反斜杠的位置,
\
在 [0-9]\{2\}
命令的 sed
部分。