【发布时间】:2014-12-24 14:26:04
【问题描述】:
我有一个从字符串生成字符数组的脚本:
#!/bin/bash
while [ -n "$1" ]
do
echo -n "{" && echo -n "$1" | sed -r "s/((\\\\x[0-9a-fA-F]+)|(\\\\[0-7]{1,3})|(\\\\?.))/'\1',/g" && echo "0}"
shift
done
效果很好:
$ wchar 'test\n' 'test\\n' 'test\123' 'test\1234' 'test\x12345'
{'t','e','s','t','\n',0}
{'t','e','s','t','\\','n',0}
{'t','e','s','t','\123',0}
{'t','e','s','t','\123','4',0}
{'t','e','s','t','\x12345',0}
但是因为 sed 认为每个新行都是全新的东西,所以它不处理实际的换行:
$ wchar 'test
> test'
{'t','e','s','t',
't','e','s','t',0}
如何将特殊字符(制表符、换行符等)替换为其转义版本,以便输出如下所示:
$ wchar 'test
> test'
{'t','e','s','t','\n','t','e','s','t',0}
编辑:一些几乎可行的想法:
echo -n "{" && echo -n "$1" | sed -r ":a;N;;s/\\n/\\\\n/;$!ba;s/((\\\\x[0-9a-fA-F]+)|(\\\\[0-7]{1,3})|(\\\\?.))/'\1',/g" && echo "0}"
生产:
$ wchar 'test\n\\n\1234\x1234abg
test
test'
{test\n\\n\1234\x1234abg\ntest\ntest0}
同时删除!:
echo -n "{" && echo -n "$1" | sed -r ":a;N;;s/\\n/\\\\n/;$ba;s/((\\\\x[0-9a-fA-F]+)|(\\\\[0-7]{1,3})|(\\\\?.))/'\1',/g" && echo "0}"
生产:
$ wchar 'test\n\\n\1234\x1234abg
test
test'
{'t','e','s','t','\n','\\','n','\123','4','\x1234ab','g','\n','t','e','s','t',
test0}
这很接近...
第一个没有执行最终替换,第二个没有正确添加最后一行
【问题讨论】:
-
我会考虑解析
od -c的输出而不是使用sed -
@JV,我想知道你的输出是否真的正确:
echo -ne 'test\x12345' | od -c输出0000000 t e s t 022 3 4 5,将\x12解释为单个字符,而不是\x12345 -
@nu11p01n73R:这是换行符的 shell 提示符。
-
@glennjackman:我使用 GCC 进行了测试,而逻辑会假定在 2 个字符 GCC 以字符串和字符的形式读取它们之后将其切断,然后执行 mod 0x100。