我有JSON文件,註釋了我在使用jq
進行操作之前刪除的註釋。我剛剛遇到了一個有趣的問題,我收到了帶有註釋註釋的JSON文件,其中包含一些富文本引號字符(十六進制93和十六進制94)。我現有的sed點.
字符與這些字符不匹配。這裏是一個演示:LC_ALL = C總是用於非特定於語言環境的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_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文檔部分Locale Considerations提到括號表達式,但上面的行爲似乎證明了這個問題發生在其他地方。
這是有趣的是,缺失的,而不是替代並沒有表現出這樣的問題:
% echo -e '# \x93text\x94\n{"a":1}' | sed '/^\s*#.*/d' | od -c
0000000 { " a " : 1 } \n
0000010
鑑於我上標註的JSON文件上進行操作,我想加入LC_ALL=C
到SED報表解決方案合理。
所以,我的問題:是使用LC_ALL=C
的東西,我一直想用做非特定於語言環境時sed
轉換(如將適用於註釋JSON文件)?如果沒有,有什麼替代方案可以避免我上面顯示的問題?
我的環境:
- 的CentOS 7.3內核3.10.0-514.6.1.el7.x86_64]
- 的sed(GNU SED)4.2.2 [沉渣 - 4.2.2-5。 el7.x86_64]
- 擊4.2.46(1)[bash的-4.2.46-21.el7_3.x86_64]
不是問題KSH(環境cerftainly不同),但嘗試下你的線我得到這可能有助於'echo -e'#\ x93text \ x94 \ n {「a」:1}'| sed'/^[[::space:]]**#.*/ s // [HERE] /'| od -c'give'0000000 [HERE] 223文本224 \ n {「a 0000020」:1} \ n '所以sed估計在換行時達到了行尾,而不是在選擇 – NeronLeVelu
@NeronLeVelu是的,它非常奇怪的行爲在任何情況下。由於sed網頁建議包括'LC_ALL = C',這讓我想知道這是否是sed中的錯誤的解決方法,或者它是一個難以理解的功能。 –