我需要使用 pdfgrep 匹配多行模式

pdfgrep -in -C line 'CHAPTER 1'[$'\n'][$' ']*'THIS IS THE TITLE' ~/temp.pdf

工作正常并输出
12:                                 CHAPTER 1
                  THIS IS THE TITLE

现在
$ pattern="CHAPTER 1 - THIS IS THE TITLE"
$ echo "'${pattern:0:9}'[$'\n'][$' ']*'${pattern:12:${#pattern}}'"
'CHAPTER 1'[$'\n'][$' ']*'THIS IS THE TITLE'
$ pdfgrep -in -C line "'${pattern:0:9}'[$'\n'][$' ']*'${pattern:12:${#pattern}}'" ~/temp.pdf

不再工作,给我什么。我想参数替换有问题,但我不知道发生了什么。任何人都可以帮忙吗?

背景资料:

来自“男人pdfgrep”
pdfgrep works much like grep, with one distinction: It operates on pages and not on lines.

“。”匹配任何字符,包括换行符。

最佳答案

您正在使用额外的 ' 字符:

"'${pattern:0:9}'[$'\n'][$' ']*'${pattern:12:${#pattern}}'"
 ^              ^              ^                         ^

此外,您在双引号内使用 $'\n'$' ',这会阻止它们的扩展。

正确的表达方式是:
"${pattern:0:9}"[$'\n'][$' ']*"${pattern:12:${#pattern}}"

实际上:
$ echo 'CHAPTER 1'[$'\n'][$' ']*'THIS IS THE TITLE'
CHAPTER 1[
][ ]*THIS IS THE TITLE

$ pattern="CHAPTER 1 - THIS IS THE TITLE"
$ echo "${pattern:0:9}"[$'\n'][$' ']*"${pattern:12:${#pattern}}"
CHAPTER 1[
][ ]*THIS IS THE TITLE

请注意,给定两个表达式时 echo 的输出是等效的(如果您做对了,echo 不应返回 Bash 表达式,它应返回最终字符串)。

这不是必需的,但作为最佳实践,您应该引用 *[] 字符(感谢 chepner 的注意)。此外,$' ' 在这里也没什么用:
"${pattern:0:9}["$'\n'"][ ]*${pattern:12:${#pattern}}"
                ^     ^  ^

这将防止 glob 扩展(这在您的情况下不太可能发生,但仍然需要关注)。

关于regex - Bash 参数替换困惑(pdfgrep、regex、换行符等),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32225894/

10-15 03:31