sed替换-请勿针对特定情况进行修改

我有一个文件,其中有许多这样写的行-

random text
some info,command -task shoot and more info
some info,command -new_task shoot and more info
more info and shoot a lot
command -task shoot and some more info and shoot a lot

我希望shoot的首字母大写,command -* shoot除外。

所以替换后,我的文件应如下所示-

random text
some info,command -new_task shoot and more info
more info and Shoot a lot
command -task shoot and some more info and Shoot a lot

我为此编写了以下脚本-

var="shoot";
sed -i "/-.*?${var}/ ! s/ ${var} / ${var^} /g" file;

除了command -* shootshoot写在同一行中的情况以外,此脚本可以正常工作。在这种情况下,我的输出为-

command -task Shoot and some more info and Shoot a lot

在这种情况下,shoot都变成大写字母,这是不希望的。 有什么办法可以解决这个问题?

k910427 回答:sed替换-请勿针对特定情况进行修改

该任务似乎需要某种形式的回溯,其中每次替换都取决于前两个标记(不能与'command-*'匹配)。如上所述,在单个条件下进行简单的全局替换将不适用于

command -task shoot and some more info and shoot a lot

鉴于sed的流程相对严格,并且缺少复杂的条件和变量,可能更容易利用sed管道,并将其构建为一系列命令:

  1. 对每个“命令-*射击”进行编码以将其隐藏起来,以免进行下一步替换
  2. 全局替换剩余的shoot(用空格包围)
  3. 还原“隐藏的”短裤。
sed -e 's/\(command -[^ ]\+ \)shoot /\1@shoot /' -e 's/ shoot / Shoot /' -e 's/ @shoot / shoot /'

“隐藏”是通过在@之前插入shoot来实现的。

可以对命令选项(-*)的模式进行调整,以使用更多受限制的字符集

根据Jotne建议简化命令,可以将3个“ -e”组合为单个脚本,并使用扩展的RE:

sed -r 's/(command -[^ ]+ )shoot /\1@shoot /;s/ shoot / Shoot /;s/ @shoot / shoot /'
本文链接:https://www.f2er.com/3161919.html

大家都在问