tr是替换单个字符的命令,但我正在寻找一个命令行解决方案,以在日志文件中替换 \ 001和| ,以提高该行的可读性。我不想用修改日志文件的命令编辑文件。
输入: FIX.4.2 \ 0019 = 64 \ 00135 = 0 \ 00134 = 363
预期输出: FIX.4.2 | 9 = 64 | 35 = 0 | 34 = 363
答案 0 :(得分:2)
使用sed将输出重定向到新文件而不更改原始文件:
sed 's/\\001/|/g' file > new_file
输出到new_file
:
FIX.4.2|9=64|35=0|34=363
答案 1 :(得分:2)
使用sed
是完成这项工作的明显方法。除非您告诉它,否则它不会覆盖输入文件。
我想你可以使用awk
;与使用sed
相比,它会(有点)更难写。您也可以使用Perl或Python。但是sed
在其作业标题中写有'无需编辑文件的替换字符串' - 覆盖内容是最近添加到非标准版本的sed(最近的意思是自1990年以来)。
这个命令可以完成这项任务 - 它也是紧凑的符号!
sed 's/\\001/|/g'
但我的理解是它取代了现有的日志文件。
否 - sed
不会替换现有的日志文件。 GNU sed
和BSD(macOS)sed
都有-i
标志,允许您覆盖输入文件 - 但它们的-i
标志的语义略有不同不同。但是,默认情况下,sed
编辑输入流(其名称是“流编辑器”的缩写)并写入标准输出。你必须告诉它覆盖输入。
awk等价物长于sed:
awk '{gsub(/\\001/, "|"); print}'
(如果您希望简洁明了)可以简化为:
awk '{gsub(/\\001/, "|")} 1'
Perl也非常紧凑:
perl -pe 's/\\001/|/g'
为完整起见,此作业的Python 2.7脚本可以是:
#!/usr/bin/env python
import re
import fileinput
match = re.compile(r'\\001')
for line in fileinput.input():
line = re.sub(match, '|', line)
print line,
(有关语法详细信息,请参阅fileinput,re和print - 尾随逗号 无关紧要。)
Python 3.x中的等价物非常相似:
#!/usr/bin/env python3
import re
import fileinput
match = re.compile(r'\\001')
for line in fileinput.input():
line = re.sub(match, '|', line)
print(line, end='')
(有关详细信息,请参阅fileinput,re和print。请注意,print()
与print
是Python 2和Python之间最大的差异之一3。)
可能有更好的方法来编写Python代码。但它似乎有用。