如何替换文本文件中每隔两次出现的单词

2023-12-06

在一个名为sample.txt,我有以下文字:

从前有一只乌龟和一只兔子。兔子跑得快,乌龟跑得慢。 兔子常常嘲笑乌龟。有一次,兔子和乌龟赛跑。 乌龟答应了兔子的请求。兔子过于自信了。 兔子想赢得比赛。兔子跑得很快。然后兔子累了。兔子想休息一下。于是兔子就睡在树下。 乌龟继续前进,赢得了比赛。

如何替换每隔两次出现的rabbit to hare使用 Unix 命令?


当输入是一行(或者你乐意在每一行的开头从 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).
现在你想要寻找序列<rabbit><not-a-rabbit><rabbit>,用我们的新符号表示就是序列\r[^\r]*\r, where [^\r]*代表任何不包含兔子字符的字符序列。
当我们找到两只兔子时,我们想记住第一只带有非兔子字符的兔子。在sed你可以记住一个匹配的序列\(..\),或使用选项-r and (..)。您可以调用第一个存储位置(我们这里只有一个)\1,在这种情况下第一只兔子\r和非兔子角色。第二只兔子\r被替换为hare.
更换第二个后\r(全球上线,所以每隔一秒),我们要改造\r把兔子放进绳子里rabbit.

更多的可能性
当您的输入文件超过 1 行时,您可能需要不同的内容。第一行有一只兔子,第二行有一只兔子,你怎么能抓住第二只兔子呢?在执行上述操作之前sed命令,您需要将输入文件转置为 1 行。之后您想要恢复行结束符,因此您需要用特殊字符替换行结束符。通常我会使用\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'

当您还想替换大写的 Rabbits 时,我们可以将这些 Rabbits 转置为\a.
您可以要求任何兔子(大或小)[\r\a],什么会使命令变得更加复杂:

tr '\n' '\v' < sample.txt | 
sed -r 's/rabbit/\r/g; s/Rabbit/\a/g; 
        s/([\r\a][^\r\a]*)[\r\a]/\1hare/g;
        s/\r/rabbit/g; s/\a/Rabbit/g' |
tr '\v' '\n'

当你想替换大写的 Rabbit 时\a带有大写字母Hare,命令将变得更加复杂(您需要另一个特殊字符)。
我想使用\x01用于标记要改变的[兔子。

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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何替换文本文件中每隔两次出现的单词 的相关文章

  • 仅当重复行与模式匹配时才删除它们

    这个问题 https stackoverflow com questions 1444406 how can i delete duplicate lines in a file in unix有一个很好的答案说你可以使用awk seen
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 如何通过 UNIX mailx 命令发送电子邮件?

    如何通过 UNIX 发送电子邮件mailx命令 一个例子 echo something mailx s subject email protected cdn cgi l email protection 发送附件 uuencode fil
  • 如何执行“sudo nvm”?

    在我的 Mac 上 我想将一些需要 su 权限的包迁移到另一个节点版本 我使用 homebrew 安装 nvm 现在我需要执行 sudo nvm 或 reinstall packages将失败 me MacBook sudo nvm sud
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • XSL字符串多重替换功能

    如何让这个函数进行多重替换 经验 替换aaa with 111并替换bbb with 222 etc
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • Python 如何找到 sys.prefix(或 sys.base_prefix)的值?

    锡上写着什么 我已经解开了如何解开的谜团sys prefix使用虚拟环境时设置 Python 寻找pyvenv cfg file 1 https www python org dev peps pep 0405 specification
  • 在 Ruby 中的文件中查找并替换

    我有一个用 ruby 编写的小程序 我在这里找到了一段很好的代码 用于查找和替换文件中的某些内容 但它似乎不起作用 这是代码 usr bin env ruby DOC test txt FIND M SEP n make substitut
  • fork 和 exec 之间的区别

    两者有什么区别fork and exec 指某东西的用途fork and exec它体现了 UNIX 的精神 它提供了一种非常简单的方法来启动新进程 The fork调用基本上复制了当前进程 在almost任何方式 并非所有内容都会被复制
  • sed/awk/bash 用外部文件内容替换两个字符串之间的文本

    我正在编写一个脚本 命令 它将采用 inputFile1 在其中查找特定的开始和结束字符串 并替换它们之间的所有文本 包含 inputFile2 的完整内容 理想情况下 但不是强制性的 这应该不需要转义特殊字符即可工作 因此我可以将字符串放
  • .zip 压缩内部是否维护校验和?

    zip 存档内部是否维护其中文件的校验和 如果它维护校验和 我如何确定校验和在解压过程中得到验证 是否可以在不解压的情况下验证校验和 是的 zip 保存存档中每个文件的 CRC 32 校验和 并且应该在解压缩过程中对其进行验证
  • 自动用 if/else 替换条件运算符?

    特定的 JS 解析器 不在我的控制范围内 不理解嵌套条件运算符语法 如下所示 return num 1 condition condition something something 因此 我想使用 if else 块替换文件中的所有条件运
  • 安装SIGTSTP前台进程

    我正在尝试为正在运行的前台进程安装 CTRL Z SIGTSTP 处理程序 我设置了处理程序 sigaction 就在我之前wait在父级中 这是正确的地方吗 好像不太好用 EDIT 我正在写一个外壳 这是我的代码的概要 我目前在父级中设置
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con
  • mod_rewrite 将 '_' 替换为 '-'

    我几乎已经有了 mod rewrite 规则 但我已经屈服了 我需要重写 country countryname php to country countryname 但是 国家 地区名称 可能有这样的下划线 south africa ph
  • 将 NSAttributedString 的子字符串替换为另一个 NSAttributedString

    我想替换一个子字符串 例如 replace of an NSAttributedString和另外一个NSAttributedString 我正在寻找一种等效的方法NSString s stringByReplacingOccurrence

随机推荐