0
给定一个由s 和s组成的字符串1
,我的目标是将 0 替换为 1,反之亦然。例子:
输入
111111100000000000000
预期输出
000000011111111111111
我尝试了以下sed
命令,但未成功
echo '111111100000000000000' | sed -e 's/0/1/g ; s/1/0/g'
000000000000000000000
我错过了什么?
0
给定一个由s 和s组成的字符串1
,我的目标是将 0 替换为 1,反之亦然。例子:
输入
111111100000000000000
预期输出
000000011111111111111
我尝试了以下sed
命令,但未成功
echo '111111100000000000000' | sed -e 's/0/1/g ; s/1/0/g'
000000000000000000000
我错过了什么?
你可以使用
tr
它,它的主要目的是字符翻译:您的
sed
命令将所有 0 替换为 1,从而生成仅包含 1 的字符串(原始 1 和所有替换的 0),然后将所有 1 替换为 0,从而生成仅包含 0 的字符串。在长流上,
tr
比sed
; 对于 100MiB 文件:虽然
tr
是完成这项工作的正确工具,但您可以sed
使用y
(音译)命令而不是s
(替换)命令来完成:y
基本上是 -sed
的内部实现,tr
包含所有暗示的开销。一种方法是
echo "111111100000000000000" | sed 's/1/2/g;s/0/1/g;s/2/0/g'
可能是一种缓慢的方法,但它以二进制方式执行,使用 shell 内置算术:
或者按字节块处理二进制流:
如果您的字符串仅包含一行并且仅由 0 和 1 组成,那么您可以使用它
如果字符串可以包含多行,则只需更改
perl -e
为perl -ne
并更改读取字节的方式(因为read
需要文件句柄)然而,这样每一行都被分解成一个字符串,所以它对于大文件可能不是很有效。在这种情况下,需要进行一点检查
如您所见,这种方式也适用于包含除
'0'
and以外的字符的字符串'1'