Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何在文本文件中每秒替换一个单词_Unix_Replace - Fatal编程技术网

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'