我有一个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
知识非常有限,到目前为止,我的实验并未产生任何有用的信息 - 我们将非常感谢您的帮助。
一切顺利,克里斯
编辑:添加了我的非工作代码
答案 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
...