我需要使用 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/