tr等效的Linux命令替换字符串而不编辑文件

时间:2017-03-08 18:56:37

标签: linux sed tr

tr是替换单个字符的命令,但我正在寻找一个命令行解决方案,以在日志文件中替换 \ 001和| ,以提高该行的可读性。我不想用修改日志文件的命令编辑文件。

输入: FIX.4.2 \ 0019 = 64 \ 00135 = 0 \ 00134 = 363

预期输出: FIX.4.2 | 9 = 64 | 35 = 0 | 34 = 363

2 个答案:

答案 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,

(有关语法详细信息,请参阅fileinputreprint - 尾随逗号 无关紧要。)

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='')

(有关详细信息,请参阅fileinputreprint。请注意,print()print是Python 2和Python之间最大的差异之一3。)

可能有更好的方法来编写Python代码。但它似乎有用。