Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json LC_ALL=C是否应始终用于非特定于语言环境的sed操作?_Json_Bash_Sed_Centos7 - Fatal编程技术网

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
      give
      0000000[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