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 代码。不过,它似乎有效。
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 代码。不过,它似乎有效。