Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 复数字符串替换_Regex_Sed - Fatal编程技术网

Regex 复数字符串替换

Regex 复数字符串替换,regex,sed,Regex,Sed,此问题的目的是将pdf文件中的/PageLabels代码()替换为另一个。我们必须这样做,因为打印pdf的程序中有一个bug(我们无法更改程序)。手工操作需要很多时间(我们每小时制作50个pdf文件) 然而,为了实用起见,这个例子可以总结如下 旧/PageLabels代码:位于名为a.pdf的原始文件中 我们使用grep函数获取不正确的/PageLabels代码: grep-aPo'/PageLabels\K[^”]*>>]>>]>'a.pdf 新建/PageLabels代码我们希望使用以下代

此问题的目的是将pdf文件中的/PageLabels代码()替换为另一个。我们必须这样做,因为打印pdf的程序中有一个bug(我们无法更改程序)。手工操作需要很多时间(我们每小时制作50个pdf文件)

然而,为了实用起见,这个例子可以总结如下

旧/PageLabels代码:位于名为a.pdf的原始文件中

我们使用grep函数获取不正确的/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