删除第三个模式(单次出现)周围的两个模式(多次出现)之间的线

删除第三个模式(单次出现)周围的两个模式(多次出现)之间的线

我正在尝试在 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'

相关内容