Unix 如何在文本文件中每秒替换一个单词
在名为Unix 如何在文本文件中每秒替换一个单词,unix,replace,Unix,Replace,在名为sample.txt的文件中,我有以下文本: 从前有一只乌龟和一只兔子。兔子跑得快,乌龟跑得慢。 兔子过去常嘲笑乌龟。有一次,兔子挑战乌龟赛跑。 乌龟接受了兔子的要求。兔子过于自信了。 兔子想赢得比赛。兔子跑得很快。然后兔子累了。兔子想休息一下。于是兔子睡在树下。 乌龟继续前进,赢得了比赛 如何使用Unix命令将每秒出现的rabbit替换为hare。$sed's/[Rr]abbit/hare/2'sample.txt如果输入为一行(或者您很乐意从每行开头的1开始计数),并且希望忽略大写的r
sample.txt
的文件中,我有以下文本:
从前有一只乌龟和一只兔子。兔子跑得快,乌龟跑得慢。
兔子过去常嘲笑乌龟。有一次,兔子挑战乌龟赛跑。
乌龟接受了兔子的要求。兔子过于自信了。
兔子想赢得比赛。兔子跑得很快。然后兔子累了。兔子想休息一下。于是兔子睡在树下。
乌龟继续前进,赢得了比赛
如何使用Unix命令将每秒出现的
rabbit
替换为hare
。$sed's/[Rr]abbit/hare/2'sample.txt如果输入为一行(或者您很乐意从每行开头的1开始计数),并且希望忽略大写的rabbit,则可以使用此解决方案:
首先用一个sed
可以匹配的字符替换所有兔子。替换第二个兔子角色并恢复其他兔子
sed -r 's/rabbit/\r/g; s/(\r[^\r]*)\r/\1hare/g; s/\r/rabbit/g' sample.txt
编辑,附加说明:当输入文件是干净的unix样式文件(没有MS-DOS结尾\r\n)时,我们知道字符
\r
是唯一的。在sed-r's/rabbit/\r/g
之后,每个兔子由\r
表示(字母r
实际上不是rabbit
的第一个字母,而是return
的第一个字母)
现在,您需要查找序列
,在我们的新符号中,即序列\r[^\r]*\r
,其中[^\r]*
表示没有兔子字符的任何字符序列。当我们发现2只兔子时,我们想记住第一只带有非兔子字符的兔子。在
sed
中,您可以使用\(..)
记住匹配的序列,或者使用选项-r
和(..)
。您可以使用\1
调用第一个内存位置(这里只有一个),在本例中,第一个兔子\r
和非兔子字符。第二只兔子\r
被hare
取代在替换第二个
\r
(行上是全局的,所以每秒钟一个)之后,我们希望将\r
兔子转换为字符串兔子
更多可能性当您的输入文件有多行时,您可能需要一些不同的内容。一只兔子在第一条线上,一只兔子在第二条线上,你怎么能抓住第二只兔子?在执行上述
sed
命令之前,需要将输入文件转换为一行。之后,您需要恢复行尾,因此需要使用特殊字符替换行尾。通常我会使用\r
来进行此操作,但该字符是为兔子保留的。字符\v
可能会
tr '\n' '\v' < sample.txt |
sed -r 's/rabbit/\r/g; s/(\r[^\r]*)\r/\1hare/g; s/\r/rabbit/g' |
tr '\v' '\n'
当您想用大写的兔子替换大写的兔子时,命令会变得更加复杂(您需要另一个特殊字符)。我想使用
\x01
标记要更改的[Rr]缩写
tr '\n' '\v' < sample.txt |
sed -r 's/rabbit/\r/g;
s/Rabbit/\a/g;
s/([\r\a][^\r\a]*)([\r\a])/\1\x01\2/g;
s/\x01\r/hare/g;
s/\x01\a/Hare/g;
s/\r/rabbit/g; s/\a/Rabbit/g' |
tr '\v' '\n'
tr'\n'\v'
这有点不够具体。带大写字母R的兔子呢?到目前为止你试过什么?我们不想执行您的任务:-)我已经尝试了这个命令{$sed's/rabbit/hare/2'sample.txt}。但正如你所说的,带R的兔子是不受影响的。帮帮我!谢谢你的陪伴jensCan请你解释一下这里发生了什么(s/(\r[^\r]*)\r/\1hare/g;)精彩的解释!!谢谢你的陪伴。
tr '\n' '\v' < sample.txt |
sed -r 's/rabbit/\r/g;
s/Rabbit/\a/g;
s/([\r\a][^\r\a]*)([\r\a])/\1\x01\2/g;
s/\x01\r/hare/g;
s/\x01\a/Hare/g;
s/\r/rabbit/g; s/\a/Rabbit/g' |
tr '\v' '\n'