我需要使用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.
""匹配任何字符,换行符包含。
答案 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周围使用方括号?