我有一个脚本可以从字符串生成char数组:
#!/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}
这很近...
第一个没有执行最终替换,第二个没有正确添加最后一行
您可以在传递到之前进行预过滤sed
。Perl将执行以下操作:
$ set -- 'test1
> test2'
$ echo -n "$1" | perl -0777 -pe 's/\n/\\n/g'
test1\ntest2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句