tr 等效 Linux 无需编辑文件即可替换字符串的命令

tr equivalent Linux Command to replace a string without editing the file

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

输入:FIX.4.2[=23=]19=64[=24=]135=0[=25=]134=363

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

使用 sed 将输出重定向到新文件而不更改原始文件:

sed 's/\001/|/g' file > new_file

输出到new_file

FIX.4.2|9=64|35=0|34=363

使用 sed 是完成这项工作的明显方法。它不会覆盖输入文件,除非您告诉它这样做。

我想你可以使用 awk;与使用 sed 相比,它会(有点)难写。您也可以使用 Perl 或 Python。但是 sed 在它的职位中写了 'replace string without editing file' ——覆盖的东西是最近添加到非标准版本的 sed (最近的意思是大约 1990 年以来)。

这个命令应该可以完成工作——而且它也是简洁的符号!

sed 's/\001/|/g'       

but my understanding is it replaces the existing log file.

否 — sed 不替换现有的日志文件。 GNU sed 和 BSD (macOS) sed 都有 -i 标志允许你覆盖输入文件——但是它们的 -i 标志的语义略有不同不同的。但是,默认情况下,sed 编辑输入流(其名称是 'stream editor' 的缩写)并写入标准输出。你必须告诉它覆盖输入。

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 and 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 and print。请注意,print()print 是 Python 2 和 Python 3 之间最大的区别之一。 )

可能有更好的方法来编写 Python 代码。不过,它似乎有效。