![在大单词列表中将“o”替换为“0”并保存原始单词?](https://linux22.com/image/55111/%E5%9C%A8%E5%A4%A7%E5%8D%95%E8%AF%8D%E5%88%97%E8%A1%A8%E4%B8%AD%E5%B0%86%E2%80%9Co%E2%80%9D%E6%9B%BF%E6%8D%A2%E4%B8%BA%E2%80%9C0%E2%80%9D%E5%B9%B6%E4%BF%9D%E5%AD%98%E5%8E%9F%E5%A7%8B%E5%8D%95%E8%AF%8D%EF%BC%9F.png)
我有一个很大的文本文件,里面有文字。每个单词都在一行上(典型的单词列表)。
我想将每个单词中的所有字符“o”替换为数字“0”,并将新形成的单词粘贴到原始单词之后的下一行。
例如,如果列表中有这两个:
dog
someone
操作后,我们的文件应如下所示:
dog
d0g
someone
s0me0ne
sed
如何使用或等 GNU 工具来完成此操作awk
?
答案1
您可以使用sed
:
sed -i -e 'p' -e 's/o/0/g' file
解释:
-i
:激活文件的就地编辑-e 'p'
: 只是粘贴该行-e 's/o/0/g'
: 将 o 替换为 0 并粘贴更改后的行
如果你想要一个awk
解决方案:
awk '1;gsub("o", "0")' file >new_file
答案2
如果每行都匹配,混沌的答案就很好。但如果某些行不包含o
,它们将被重复。
例如:
$ echo -e 'foo\nbar' | sed -e 'p' -e 's/o/0/g'
foo
f00
bar
bar
以下是一些不重复行的其他解决方案:
$ echo -e 'foo\nbar' | sed -e '/o/ p; s//0/g'
foo
f00
bar
$ echo -e 'foo\nbar' | perl -pe '/o/ && print; s/o/0/g'
foo
f00
bar
$ echo -e 'foo\nbar' | awk '{ print } /o/ { gsub(/o/, "0"); print }'
foo
f00
bar
答案3
另一个sed
解决方案:
sed -ne 'p;s/o/0/pg' file
$ printf '%s\n%s\n' 'foo' 'bar' | sed -ne 'p;s/o/0/pg'
foo
f00
bar
解释
-n
选项会sed
抑制默认输出。p
命令将模式空间写入标准输出。s/o/O/pg
替换所有出现的(g
标志)o
with0
,如果进行了替换(p
标志),则仅将模式空间写入标准输出。