我想按字符过滤文件(为了删除我无法控制生成的无效 xml 字符),但我似乎什至无法将单个字符从一个文件复制到另一个文件。我printf
以前复制包括回车在内的文字部分,但现在它不会将回车复制为一个,而是复制为一些空长度的字符串。我的代码:
infile=$1
outfile=$2
touch $outfile
while IFS= read -r -n1 char
do
# display one character at a time
printf "%s" "$char" >> $outfile
done < "$infile"
diff $infile $outfile
我不介意使用 sed 或 awk,但我必须对允许的字符进行编码。
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
回车不应该是一个问题,
read
应该读它就好了。换行符(换行符)是,因为它是read
. 您可以使用该read -d ''
技巧使其工作。但是,就像他们说的那样,你可能不想在 shell 中做这样的事情。
tr
这正是删除一组固定字符所需要的,但至少 GNUtr
适用于字节,而不是字符,因此它对 Unicode 没有多大用处。如果您的语言环境正确设置为 UTF-8,我认为这个 Perl 应该适用于 UTF-8 数据:
但更好地测试它,我不习惯 Unicode 怪癖。
tr/abc//cd
abc
删除(tr///
实际上是为了将字符转换为其他字符,请参阅perlop
)中未列出的字符。它接受字符列表以及范围,并表示具有十六进制值HH的字符,以及具有值HHHH的字符。所以上面接受, , , 从to等的一切。\xHH
\x{HHHH}
0x09
0x0a
0x0d
0x20
0xd7ff
上面的列表直接取自问题中提供的列表。我会把它留给最终用户来评估是否应该改变它。