Bash:更改postscript文件的“标题”

时间:2014-01-26 20:55:15

标签: regex bash sed

我有一个postscript文件,我想在从中生成pdf之前更改“Title”属性。

在文件开头之后:

%!PS-Adobe-3.0
%%BoundingBox: 0 0 595 842
%%HiResBoundingBox: 0 0 595 842
%%Title: GMT v5.1.1_r12693 [64-bit] Document from pscoast
%%Creator: GMT5
[…]

我现在将行%%Title: GMT v5.1.1_r12693 [64-bit] Document from pscoast^%%Title:\s.*匹配,并希望将冒号后的所有内容替换为变量的内容。

到目前为止我的非工作代码:

sed "s/\(^%%Title:\)\s.*$/\1 $title/g" test_file.ps

我的sed知识非常有限,到目前为止,我的实验并未产生任何有用的信息 - 我们将非常感谢您的帮助。

一切顺利,克里斯

编辑:添加了我的非工作代码

2 个答案:

答案 0 :(得分:1)

sed正常工作的一个技巧是让shell引用正确。这将创建一个带有新标题的postscript文件:

newtitle="Shiny New Title"
sed 's/^%%Title:.*/%%Title: '"$newtitle/" sample.ps >new.ps

这会更新后记:

newtitle="Shiny New Title"
sed -i 's/^%%Title:.*/%%Title: '"$newtitle/" sample.ps

sed表达式中使用的许多字符(如$(*)都是shell活动的。为了保护它们免受可能的shell扩展,它们应该是单引号。但是,因为有人希望shell扩展$newtitle变量,所以它不能是单引号。因此,如果你仔细观察,你会发现上面的替代表达式分为两个部分,一个是单引号,一个是双引号。在它们之间添加一个空格以使其更清晰:

's/^%%Title:.*/%%Title: ' "$newtitle/" # Do not use this form.

因此,shell-active字符受单引号保护,只有我们希望shell搞乱的部分是双引号

答案 1 :(得分:1)

也许这就是你要找的东西:

myvar="some content"
sed -e "s/^\(%%Title:\).*/\1 $myvar/" < inputfile

# output
...
%%Title: some content
...