Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
Linux Sed无法替换,UTF-8编码_Linux_Bash_Utf 8_Sed_Pattern Matching - Fatal编程技术网

Linux Sed无法替换,UTF-8编码

Linux Sed无法替换,UTF-8编码,linux,bash,utf-8,sed,pattern-matching,Linux,Bash,Utf 8,Sed,Pattern Matching,我正在尝试进行一些文件内容转换。我在Linux操作系统中使用文本编码: echo $LANG en_US.UTF-8 我是从Putty终端访问的,配置如下:窗口->翻译->远程字符集->UTF-8 我要对以下日志文件进行转换: cat test.log | head 这就是我在终端中看到的情况/如果我使用nano编辑文件/如果我将终端内容复制并粘贴到Windows中的记事本中(注意第一个IP后的三个破折号): 如果我将内容复制/粘贴到Windows中的here/wordpad中,我会看到这一

我正在尝试进行一些文件内容转换。我在Linux操作系统中使用文本编码:

echo $LANG
en_US.UTF-8
我是从Putty终端访问的,配置如下:窗口->翻译->远程字符集->UTF-8

我要对以下日志文件进行转换:

cat test.log | head
这就是我在终端中看到的情况/如果我使用nano编辑文件/如果我将终端内容复制并粘贴到Windows中的记事本中(注意第一个IP后的三个破折号):

如果我将内容复制/粘贴到Windows中的here/wordpad中,我会看到这一点(请注意,第一个IP后面只有一个破折号):

我尝试使用sed应用以下转换:

cat test.log | sed "s,- - - Cookie=,-,g"
转换没有做任何事情,我得到了与以前相同的结果(根据查看/复制粘贴的位置不同)

如果我用鼠标选择并从终端上的文件内容复制模式“--Cookie=”并将其粘贴到sed命令上的终端上,那么它确实会被替换

在终端上获取此结果并将其复制粘贴到其他位置:

10.0.2.4 - -  [11/Jun/2014:12:51:48 +0000]
    "GET /hub/ HTTP/1.1" 302 0 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140429 Firefox/24.0 Iceweasel/24.5.0" "1.1.1.1"
因此,我创建了一个脚本,用鼠标从终端上的文件内容中选择并复制粘贴破折号“-”,然后用“手动”键入的破折号替换它:

(第一个破折号是从文件内容复制粘贴的,第二个破折号是手动写入的)

但是,我仍然无法使文件test1.log上的sed转换正常工作:

cat test.log | sed "s,- - - Cookie=,-,g"
产生与最初相同的结果

文件的编码为UTF-8:

file -bi test.log
text/plain; charset=utf-8

您正在用
-
替换
-
,当然您会得到
-
,这就是您告诉它要做的。如果要保留
Cookie=
部分,则需要将其添加到替换文本中。尝试:

cat test.log | sed 's/- - - Cookie=/- Cookie=/g'

注意:使用带有
sed
的简单引号优于双引号,您不能忘记取消双引号中仍处于活动状态的
$
-s和
\
-s。此外,虽然您可以将任何分隔符字符与
sed
一起使用,
/
是首选字符,而且它看起来比
好得多,
多亏了lxg和Evan Dark。我用hexdump解决了这个问题:

hexdump -C test1.log
获得此结果:

00000000  31 30 2e 30 2e 32 2e 34  20 c2 ad 20 2d 20 c2 ad  |10.0.2.4 .. - ..|
00000010  20 43 6f 6f 6b 69 65 3d  20 2d 20 20 5b 31 37 2f  | Cookie= -  [17/|
因此,左边的16组2个十六进制数字代表右边ASCII上的每个字符。因此,我只需要用破折号(-)替换“.”(ASCII)“c2 ad”(十六进制)

我通过以下方式使用sed来实现这一点:

cat test1.log | sed 's/\xc2\xad/-/g'
获得:

10.0.2.4 - - - Cookie= -  [11/Jun/2014:12:51:48 +0000]
"GET /hub/ HTTP/1.1" 302 0 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140429 Firefox/24.0 Iceweasel/24.5.0" "1.1.1.1"
然后,我以前的sed命令可以完美地工作:

cat test1.log | sed 's/\xc2\xad/-/g' | sed "s,- - - Cookie=,-,g"

10.0.2.4 - -  [11/Jun/2014:12:51:48 +0000]
"GET /hub/ HTTP/1.1" 302 0 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140429 Firefox/24.0 Iceweasel/24.5.0" "1.1.1.1"

通过
hextump
运行相关行,玩一下
-b
-c
-d
选项。谢谢lxg,我使用hextump获得了答案…谢谢你的回复。仅通过对文件执行cat,我就可以根据查看/复制粘贴的位置获得不同的结果。如果我手动键入sed命令,它不会将“--Cookie=”替换为“-”。我只能通过使用鼠标选择并从cat内容复制模式“--Cookie=”然后将其粘贴到sed命令中来获得此结果。。。除此之外,我不能在批处理中这样做,即使我尝试替换从cat文件终端复制的“-”并用普通破折号粘贴到sed中……这对我很有效,您发布的是纯ASCII,其中没有UTF-8序列。也许在原始文本中有一些在模式中看不到的不可见UTF-8字符,但当您复制并粘贴它时,它们就会出现。尝试使用十六进制编辑器查看实际字节。
cat test1.log | sed 's/\xc2\xad/-/g'
10.0.2.4 - - - Cookie= -  [11/Jun/2014:12:51:48 +0000]
"GET /hub/ HTTP/1.1" 302 0 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140429 Firefox/24.0 Iceweasel/24.5.0" "1.1.1.1"
cat test1.log | sed 's/\xc2\xad/-/g' | sed "s,- - - Cookie=,-,g"

10.0.2.4 - -  [11/Jun/2014:12:51:48 +0000]
"GET /hub/ HTTP/1.1" 302 0 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140429 Firefox/24.0 Iceweasel/24.5.0" "1.1.1.1"