我正在尝试在 macOS Monterey 上编辑未压缩的 PDF,我想删除描述中包含特定模式的对象。此类对象以“X 0 obj”(其中 X 是对象编号)开头,以“endobj”结尾。在下面的简化示例中,我只想删除包含字符串“ba r”的对象(对象 4,因此是第 5 至第 9 行)。
line 1
3 0 obj
fo o
endobj
4 0 obj
quz
ba r
quz
endobj
5 0 obj
ba z
endobj
line 11
我已设法使用以下 sed 命令删除包含以下代码的第 7-9 行,但没有其他结果……
sed /'ba r'/,/endobj/d file.txt
我认为可以通过反向读取文件(tac file.txt
)并通过管道输出到来完成sed
。然后删除“ba r”和“0 obj”之间的行(不包括“ba r”本身)。然后再次恢复文件读取顺序并删除“ba r”和“endobj”之间的行。然后以相同的名称保存文件。
但是我使用 sed 的所有尝试都失败了,可能是因为单引号和双引号(“ba r”中的空格是必需的)。有人能帮忙吗?或者建议更好的方法?awk
如果这样更容易,我愿意尝试,但我更喜欢使用sed
。
答案1
的引号sed
必须像这样放在表达:
sed '/ba r/,/endobj/d'
(没有按您预期的那样工作)。
如果有sed
& awk
,则有perl
:
$ perl -0pe 's/^(ba r).*?endobj/$1/ms' file
line 1
3 0 obj
fo o
endobj
4 0 obj
quz
ba r
5 0 obj
ba z
endobj
line 11
-i
如需编辑,请添加开关到位:
perl -i -pe .......
答案2
我设法将其写入sed
,与问题中描述的完全一致:
tac file.txt | sed '/^ba r$/,/^[1-9] 0 obj$/{/^ba r$/p;d;}' | tac | sed '/^ba r$/,/^endobj$/d'