【发布时间】:2017-04-03 13:34:32
【问题描述】:
我正在尝试使用 enscript 从 Mutt 打印 PDF,但遇到了字符编码问题。解决它们的一种方法似乎是只使用 sed 替换问题字符:sed -ir 's/[“”]/"/g' {input}
我的测试输入文件是这样的:
“very dirty”
we’re
我希望得到"very dirty" 和we're,但我还是得到了
â\200\234very dirtyâ\200\235
weâ\200\231re
我在printing to PDFs from Mutt 上找到了一个不错的小帖子,我以此为起点。我有一个 bash 脚本,我从我的 .muttrc 和 set print_command="$HOME/.mutt/print.sh" 指向——该脚本目前的内容如下:
#!/bin/bash
input="$1" pdir="$HOME/Desktop" open_pdf=evince
# Straighten out curly quotes
sed -ir 's/[“”]/"/g' $input
sed -ir "s/[’]/'/g" $input
tmpfile="`mktemp $pdir/mutt_XXXXXXXX.pdf`"
enscript --font=Courier8 $input -2r --word-wrap --fancy-header=mutt -p - 2>/dev/null | ps2pdf - $tmpfile
$open_pdf $tmpfile >/dev/null 2>&1 &
sleep 1
rm $tmpfile
它在创建 PDF 方面做得很好(如果你给它一个文件作为参数,它工作得很好)但我不知道如何修复花引号。
我在sed 行上尝试了很多变体:
input=sed -r 's/[“”]/"/g' $input
$input=sed -ir "s/[’]/'/g" $input
根据Can I use sed to manipulate a variable in bash? 的建议,我也尝试了input=$(sed -r 's/[“”]/"/g' <<< $input),但出现错误:“语法错误:重定向意外”
但是没有人能够真正改变$input——用sed改变$input的正确语法是什么?
注意:我接受了一个解决了我提出的问题的答案,但正如您从 cmets 看到的,这里还有几个其他问题。 enscript 将整个文件作为变量,而不仅仅是文件的文本。因此,尝试调整文件中的文本将需要一些额外的步骤。我还在学习。
【问题讨论】:
-
请注意,如果您希望这些引号实际影响参数的分组方式(即具有语义意义),那么在您的脚本启动后修复它为时已晚——它们已经被视为文字而不是句法。
-
另外,考虑使用小写的变量名——根据环境变量名的 POSIX 规范,全大写的名称保留给修改系统或 shell 行为的变量,而名称至少保留一个小写字符供应用程序使用。由于设置一个名称与环境变量重叠的 shell 变量会覆盖后者,因此这些约定必然适用于这两个地方。
-
...你也可以考虑通过shellcheck.net运行你的代码
-
@Stargateur 我将进行编辑,但它在命令行上运行良好。它只是没有改变