从日志文件中删除 ^M 字符。
在我的脚本中,我将程序的输出重定向到日志文件。我的日志文件的输出包含一些 ^M(换行符)字符。我需要在运行时删除它们。
我的命令:
$ java -jar test.jar >> test.log
test.log
有:
启动脚本...^M 启动脚本...初始化
答案1
转换独立文件
如果您运行以下命令:
$ dos2unix <file>
将<file>
删除所有 ^M 字符。如果你想保持<file>
原样,那么只需dos2unix
像这样运行:
$ dos2unix -n <file> <newfile>
解析命令的输出
如果您需要通过管道将它们作为命令链的一部分来执行,则可以使用任意数量的工具(例如tr
、sed
、awk
或 )perl
来执行此操作。
t
$ java -jar test.jar | tr -d '^M' >> test.log
sed
$ java -jar test.jar | sed 's/^M//g' >> test.log
awk
$ java -jar test.jar | awk 'sub(/^M/,"")' >> test.log
珀尔
$ java -jar test.jar | perl -p -e 's/^M//g' >> test.log
键入 ^M
输入时请^M
务必通过以下方式之一输入:
- 作为Control+ v+M而不是Shift+ 6+ M。
- 作为反斜杠r,即(
\r
)。 - 作为八进制数 (
\015
)。 - 作为十六进制数 (
\x0D
)。
为什么这是必要的?
这^M
是 Windows 平台上行尾终止方式的一部分。每行的末尾都以回车符和换行符结束。
在 Unix 系统上,行尾仅由换行符终止。
- 换行符 =
0x0A
十六进制,也写为\n
. 0x0D
十六进制的回车符 = ,也写为\r
.
例子
如果将输出通过管道传输到od
或等工具,您可以看到这些hexdump
。下面是一个示例文件,其中包含以回车符 + 换行符结尾的行。
$ cat sample.txt
hi there
bye there
您可以使用hexdump
as \r
+来查看它们\n
:
$ hexdump -c sample.txt
0000000 h i t h e r e \r \n b y e t h
0000010 e r e \r \n
0000015
或者作为它们的十六进制0d
+ 0a
:
$ hexdump -C sample.txt
00000000 68 69 20 74 68 65 72 65 0d 0a 62 79 65 20 74 68 |hi there..bye th|
00000010 65 72 65 0d 0a |ere..|
00000015
运行这个sed 's/\r//g'
:
$ sed 's/\r//g' sample.txt |hexdump -C
00000000 68 69 20 74 68 65 72 65 0a 62 79 65 20 74 68 65 |hi there.bye the|
00000010 72 65 0a |re.|
00000013
您可以看到sed
已删除该0d
角色。
使用 ^M 查看文件而不进行转换?
是的,您可以用来vim
执行此操作。您可以fileformat
在 vim 中进行设置,这将具有像我们上面所做的那样转换文件的效果,或者您可以在视图中更改文件格式vim
。
更改文件格式
:set fileformat=dos
:set fileformat=unix
您也可以使用简写符号:
:set ff=dos
:set ff=unix
或者,您可以只更改视图的文件格式。这种方法是非破坏性的:
:e ++ff=dos
:e ++ff=unix
在这里你可以看到我打开我们的^M
文件,sample.txt
在vim
:
现在我正在视图中转换文件格式:
转换为文件格式后的样子如下unix
:
参考
答案2
将文件推入dos2unix
以修复行结尾。
或者,使用其中之一:
sed 's,\r$,,'
tr -d '\r'
答案3
您需要修复您的程序以进行调用isatty()
,如果 stdout 不是 tty,则不要输出 ^M。
答案4
去掉没有特殊符号的^M:
$ tr -d '\015' <file1 >file2
$ mv file2 file1