Regex 复数字符串替换
此问题的目的是将pdf文件中的/PageLabels代码()替换为另一个。我们必须这样做,因为打印pdf的程序中有一个bug(我们无法更改程序)。手工操作需要很多时间(我们每小时制作50个pdf文件) 然而,为了实用起见,这个例子可以总结如下 旧/PageLabels代码:位于名为a.pdf的原始文件中 我们使用grep函数获取不正确的/PageLabels代码:Regex 复数字符串替换,regex,sed,Regex,Sed,此问题的目的是将pdf文件中的/PageLabels代码()替换为另一个。我们必须这样做,因为打印pdf的程序中有一个bug(我们无法更改程序)。手工操作需要很多时间(我们每小时制作50个pdf文件) 然而,为了实用起见,这个例子可以总结如下 旧/PageLabels代码:位于名为a.pdf的原始文件中 我们使用grep函数获取不正确的/PageLabels代码: grep-aPo'/PageLabels\K[^”]*>>]>>]>'a.pdf 新建/PageLabels代码我们希望使用以下代
grep-aPo'/PageLabels\K[^”]*>>]>>]>'a.pdf
新建/PageLabels代码我们希望使用以下代码替换“旧/PageLabels代码”。这是另一个脚本重新评估pdf并获得正确的pdf/PageLabel代码(手动测试和验证)的结果
它将保存在另一个名为b.pdf的文件中
我们不知道如何使用sed函数编写它
如果您有任何想法,我将不胜感激。我不了解您试图从链中替换的具体信息。但是,当我分解链时,我看到如下图所示的变化(Stack疯狂地尝试替换所有特殊字符,因此以图片的形式插入) 如果我假设正确,您希望使用
1>>12
更改页面标签1>>6
,依此类推
如果这是您想要的,您可以使用以下命令以新替换旧
cata.pdf | sed-e's/1>>20/1>>98/'-e's/1>>28/1>>130/'
等等。
只要shell接受-e,您就可以继续向上面添加它[这取决于您的*nix版本]
或者,您需要编写一个shell脚本来读取每一行,并根据特定的逻辑替换一个微粒字段。假设新的_链中的数字与旧的_链中的数字相差某个K因子,可以公式化
如果您可以按照以下方式发布旧/新数据,并让我知道新旧数据之间是否存在任何标准差异,我可以进一步提供帮助
希望这有帮助。您应该使用
replace
而不是sed
或regex
:
#! /bin/bash
old=$(grep -aPo '/PageLabels\K[^"]*>>]>>' a.pdf) ## Get Old /PageLabels code
new=$(/tmp/get_correct_code.sh ) ## Get New /PageLabels code
cat a.pdf |replace "$old" "$new" > new_a.pdf
从手册页:
DESCRIPTION
The replace utility program changes strings in place in files or on the standard input.
Invoke replace in one of the following ways:
shell> replace from to [from to] ... -- file_name [file_name] ...
shell> replace from to [from to] ... < file_name
你能简化一下这里的匹配规则吗?同时添加一些有疑问的细节。谢谢你的反馈!刚刚重述!什么是“链”“在这儿?在这堆乱七八糟的PDF垃圾中,你到底想匹配和替换什么?很难解释这个例子,但我又试了一次。谢谢你的反馈!谢谢你的回答。但是条件是使用sed功能。使用
sed
方法更新。非常感谢!它起作用了!。我在这里也找到了同样的解释。首先,谢谢你的回答和时间。不幸的是,您提出的解决方案无效。这个假设是错误的;我们想替换整个字符串。如您所见,新的_链几乎与旧的_链相同。然而,在其他情况下,旧链和新链甚至不相似。这个新的_链重新排列pdf中/PageLabels中的数字。我必须解释,如果要替换pdf文档中的/PageLabels代码,添加的新字节数必须与最早的字节数完全相同。换句话说,新的\u链必须与旧的\u链具有相同的大小。幸运的是,旧的字节数总是大于新的字节数(让我们看看为什么会这样)。因此,我们添加了0x20(ASCII字符:空格),以在新的_链中完成正确的大小
#! /bin/bash
old=$(grep -aPo '/PageLabels\K[^"]*>>]>>' a.pdf) ## Get Old /PageLabels code
new=$(/tmp/get_correct_code.sh ) ## Get New /PageLabels code
cat a.pdf |replace "$old" "$new" > new_a.pdf
DESCRIPTION
The replace utility program changes strings in place in files or on the standard input.
Invoke replace in one of the following ways:
shell> replace from to [from to] ... -- file_name [file_name] ...
shell> replace from to [from to] ... < file_name
#! /bin/bash
old=$(grep -aPo '/PageLabels\K[^"]*>>]>>' a.pdf) ## Get Old /PageLabels code
new=$(/tmp/get_correct_code.sh ) ## Get New /PageLabels code
# To replace $old with $new, first you'd have to escape those characters like [, ], -
eold=$(echo $old | sed 's@\([][-]\)@\\\1@g')
# Then do the replace using sed
sed "s@$eold@$new@g" a.pdf > b.pdf