Json LC_ALL=C是否应始终用于非特定于语言环境的sed操作?
在使用Json LC_ALL=C是否应始终用于非特定于语言环境的sed操作?,json,bash,sed,centos7,Json,Bash,Sed,Centos7,在使用jq进行操作之前,我有带注释的JSON文件。我刚刚遇到了一个有趣的问题,我收到了一个带有注释的JSON文件,其中包含一些富文本引号字符(hex 93和hex 94)。我现有的sed点字符与这些字符不匹配。下面是一个演示: 首先,输入: % echo -e '# \x93text\x94\n{"a":1}' | od -c 0000000 # 223 t e x t 224 \n { " a " : 1 } 0000020 \n 0
jq
进行操作之前,我有带注释的JSON文件。我刚刚遇到了一个有趣的问题,我收到了一个带有注释的JSON文件,其中包含一些富文本引号字符(hex 93和hex 94)。我现有的sed点
字符与这些字符不匹配。下面是一个演示:
首先,输入:
% echo -e '# \x93text\x94\n{"a":1}' | od -c
0000000 # 223 t e x t 224 \n { " a " : 1 }
0000020 \n
0000021
%
这里是转换:
% echo -e '# \x93text\x94\n{"a":1}' | sed 's/^\s*#.*//' | od -c
0000000 223 t e x t 224 \n { " a " : 1 } \n
0000017
%
请注意,sed表达式中的点字符与十六进制93字符不匹配。但是,如果我包括LC\u ALL=C
:
% echo -e '# \x93text\x94\n{"a":1}' | LC_ALL=C sed 's/^\s*#.*//' | od -c
0000000 \n { " a " : 1 } \n
0000011
%
然后sed表达式中的点字符与十六进制93和94字符匹配。sed文档部分提到了括号表达式,但是上面的行为似乎证明了这个问题发生在其他地方
有趣的是,删除而不是替换并没有显示此问题:
% echo -e '# \x93text\x94\n{"a":1}' | sed '/^\s*#.*/d' | od -c
0000000 { " a " : 1 } \n
0000010
考虑到我操作的是带注释的JSON文件,我认为向sed语句添加LC_ALL=C
的解决方案是合理的
那么,我的问题是:是否使用了LC_ALL=C
一些我在执行非特定于语言环境的sed
转换时总是想使用的东西(适用于带注释的JSON文件)?如果没有,有什么替代方案可以避免我上面提到的问题
我的环境:
- CentOS 7.3[kernel-3.10.0-514.6.1.el7.x86_64]
- sed(gnused)4.2.2[sed-4.2.2-5.el7.x86_64]
- Bash 4.2.46(1)[Bash-4.2.46-21.el7_3.x86_64]
- C语言环境是一种特殊的语言环境,是最简单的语言环境。您还可以说,虽然其他语言环境是针对人类的,但C语言环境是针对计算机的在C语言环境中,字符为单字节,字符集为ASCII
在某些系统上,POSIX语言环境存在差异,例如,未定义非ASCII字符的排序顺序
所以LC_ALL=C是将非8位字符考虑在内的安全方法
见比较
使用LC时,sed计数作为字符的一部分
echo -e '# \x93text\x94\n{"a":1}' | LC_ALL=C sed 's/[^[:alnum:]]/[HERE:&] /g' | od -c
0000000 [ H E R E : # ] [ H E R E :
0000020 ] [ H E R E : 223 ] t e x t [
0000040 H E R E : 224 ] \n [ H E R E : {
0000060 ] [ H E R E : " ] a [ H E R
0000100 E : " ] [ H E R E : : ] 1 [
0000120 H E R E : } ] \n
如果没有LC,sed将不被计算为要考虑的字符的一部分([[:alnum:]
和[^[:alnum:]
没有看到第8位字符)
C语言环境是一种特殊的语言环境,是最简单的语言环境。您还可以说,虽然其他语言环境是针对人类的,但C语言环境是针对计算机的在C语言环境中,字符为单字节,字符集为ASCII 在某些系统上,POSIX语言环境存在差异,例如,未定义非ASCII字符的排序顺序 所以LC_ALL=C是将非8位字符考虑在内的安全方法 见比较 使用LC时,sed计数作为字符的一部分
echo -e '# \x93text\x94\n{"a":1}' | LC_ALL=C sed 's/[^[:alnum:]]/[HERE:&] /g' | od -c
0000000 [ H E R E : # ] [ H E R E :
0000020 ] [ H E R E : 223 ] t e x t [
0000040 H E R E : 224 ] \n [ H E R E : {
0000060 ] [ H E R E : " ] a [ H E R
0000100 E : " ] [ H E R E : : ] 1 [
0000120 H E R E : } ] \n
如果没有LC,sed将不被计算为要考虑的字符的一部分([[:alnum:]
和[^[:alnum:]
没有看到第8位字符)
这不是KSH下的问题(环境是完全不同的),但试一下你的线路,我得到了这个可以帮助
echo-e'\x93text\x94\n{“a”:1}'| sed'/^[:space:][s/.*.*/s/[HERE]/'/od-c
给出0000000[he re]223 t x t 224\n{“a 0000020”:1}\n
因此,sed在替换中估计到达了行的末尾,而不是在selection@NeronLeVelu是的,无论如何这都是很奇怪的行为。由于sed网页建议包含LC_ALL=C
,这让我想知道这是否是sed中一个bug的解决方法,或者它是否是一个难以理解的特性。这不是KSH下的问题(环境是完全不同的),但试一下你的话,我得到了这个可能有助于echo-e'\x93text\x94\n{“a”:1}sed'/^[[:space:][]*#.*/s/[HERE]/'| od-c
give0000000[HERE]223tex224\n{“a 0000020”:1}\n
因此,sed在替换中估计到达了行的末尾,而不是在selection@NeronLeVelu是的,这在任何情况下都是非常奇怪的行为。由于sed网页建议包含LC_ALL=C
,这让我想知道这是否是sed中缺陷的解决方法,或者这是一个难以理解的功能。那么,您认为我甚至可能在我的脚本中将其用作全局选项(export LC_ALL=C
)?即使用于其他目的的字符串操作涉及特定于语言环境的数据,那么我猜替换仍然会做正确的事情。例如,一个s/$locale\u WORD/$REPLACEMENT/
,其中两个词是特定于语言环境的,仍然可以正确地处理LC\u ALL=C
,对吗?这会促使我将其设置为环境变量,而不是每次使用sed时的in-from。您认为如何?这是一种sed行为,因此仅将其添加到sed(批处理中的每个sed)中,以避免其他应用程序上出现其他意外行为(可能发生此问题时,仅限于我的观点和在批处理中使用它的方式)很好。我会的。谢谢你花时间回答。将此标记为已接受的答案。那么,你认为我甚至可以在脚本中使用此选项作为全局选项(export LC_ALL=C
)?即使用于其他目的的字符串操作涉及特定于语言环境的数据,那么我猜替换仍然会做正确的事情。例如,一个s/$locale\u WORD/$REPLACEMENT/
,其中两个词是特定于语言环境的,仍然可以正确地处理LC\u ALL=C
,对吗?这会促使我将其设置为环境变量,而不是每次使用sed时的in-from。您认为如何?这是一种sed行为,因此仅将其添加到sed(批处理中的每个sed)中,以避免其他应用程序上出现其他意外行为(可能发生此问题时,仅限于我的观点和在批处理中使用它的方式)很好。我会的。谢谢你花时间回答。把这个标记为t