Bash参数替换混乱(pdfgrep,正则表达式,换行符等)

时间:2015-08-26 11:51:31

标签: regex bash

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

不再工作,什么都不给我。我猜参数替换有一些问题,但我无法弄清楚发生了什么。有人可以帮忙吗?

背景资讯:

来自" man pdfgrep"

pdfgrep works much like grep, with one distinction: It operates on pages and not on lines.

""匹配任何字符,换行符包含。

2 个答案:

答案 0 :(得分:4)

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

"'${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}}"
                ^     ^  ^

这会阻止全局扩展(在您的情况下不太可能发生,但仍需要关注)。

答案 1 :(得分:1)

当字符串被双引号时,

$'\ n'不会插入换行符:

prompt $ echo "$'\n'"
$'\n'
prompt $ echo $'\n'

不要在字符串周围使用双引号:

prompt $ a='abcd'$'\n''efgc'
prompt $ echo "$a"
abcd
efgc

P.S。你的正则表达式看起来很奇怪。为什么在\ n和\ s周围使用方括号?