3

我有一条与此类似的线

grep -oP "data-context-item-title=.*.data-context-item-id" web.html | cut -d'"' -f2

我知道这条线可以正常工作,因为我在终端上使用了它,它给了我想要的输出。但是,我想将此行放在 bash 脚本中。所以到目前为止我有这个

title="$(grep -oP 'data-context-item-title=.*.data-context-item-id' web.html | cut -d'"' -f2)"

这是一个问题,因为它将第一个 "(quotation) 与 cut 的 "(quotation) 匹配。有没有办法避免呢?

没有 cut 功能的输出与此类似

data-context-item-title="Some long title" data-context-item-id
data-context-item-title="Another very long title" data-context-item-id

请记住,我不能使用任何 sed 或 awk 命令来替换 cut。

谢谢

4

5 回答 5

3

由于您使用的是 bash,因此可以安全地使用:

title=$(grep -oP 'data-context-item-title=.*.data-context-item-id' web.html | cut -d'"' -f2)

这将保留变量中的内部间距(特别是换行符),因为您可以看到是否这样做:

echo "$title"

我认为,如果您设法找到要使用的 UNIX™ 第 7版Bourne$(...) Shell,那么省略符号(或更准确地说,符号)周围的双引号`...`是不安全的,但它似乎确实在现代 shell 上安全工作(比如那些最近一次更新是在当前千年,而不是在前一个)。困难在于找到一个旧的 Bourne Shell 来验证我现在摇摇欲坠(因为遥远)的记忆。

然而,令我困惑的是,bash在 Mac OS X 10.7.5 上运行 3.2(系统)和 4.2(自制)时,无论有没有$(...). bash您使用的是哪个版本,在哪个平台上使用?

于 2012-11-03T20:59:33.127 回答
0

cut 中分隔符的参数是双引号而不是单引号。使用反冲来逃避实际报价

于 2012-11-03T19:20:53.723 回答
0

疯狂的建议:您的命令中的一个引号是否可能不是纯 ASCII 引号,而是某种 Unicode 花式引号(shell 无法识别)?

于 2012-11-03T21:31:35.423 回答
0

首先,要解决错误,请转义双引号cut

title="$(... | cut -d \" ...)"

但是,您使用的是 grep 的 PCRE,因此您可以使用环视和完全删除:

title=$(grep -oP '(?<=data-context-item-title=").*?(?=" data-context-item-id)' web.html)
于 2012-11-04T13:03:33.913 回答
-1

不确定这是否是拼写错误,但您似乎忘记了右括号$(...)

于 2012-11-03T19:31:46.060 回答