如何使用 Sed 结合乘法器提取(不包括)两个匹配模式之间的字符字符串?

问题描述 投票:0回答:1

我正在尝试使用

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
部分。

linux unix sed pattern-matching
1个回答
0
投票

经过深思熟虑,我发现我需要转义大括号

{
}
,这样
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
部分。

© www.soinside.com 2019 - 2024. All rights reserved.