我们如何将同一目录下每个文本文件最后一行(内容)末尾的 * 替换为 1/2-1/2 或 1-0 或 0-1?

我们如何将同一目录下每个文本文件最后一行(内容)末尾的 * 替换为 1/2-1/2 或 1-0 或 0-1?

在各位朋友的指导下,我成功完成了几个文本文件的操作。首先非常感谢你们在命令方面的帮助。

现在,我希望进一步对文本文件进行这些操作,而我遇到的一个问题就是,我希望能够使用或或删除*最后一行末尾的(同一目录下每个文本文件的)1/2-1/21-00-1

这是文本文件的内容:

在此处输入图片描述

  1. Nh3 d5 2. g3 e5 3. f4 Bxh3 4. Bxh3 exf4*

而 1/2-1/2 代表平局,如下所示: 在此处输入图片描述

  1. Nh3 d5 2. g3 e5 3. f4 Bxh3 4. Bxh3 exf4 1/2-1/2

1-0 表示白棋获胜,情况如下: 在此处输入图片描述

  1. Nh3 d5 2. g3 e5 3. f4 Bxh3 4. Bxh3 exf4 1-0

0-1 意味着黑方获胜,情况如下: 在此处输入图片描述

  1. Nh3 d5 2. g3 e5 3. f4 Bxh3 4. Bxh3 exf4 0-1

请忽略标题中的*,我只想更改文本文件的内容。

我希望这样做是因为通过将其从任何或1/2-1/21-0中隐藏起来0-1,我将能够让象棋引擎相信比赛是平局、输了还是赢了。这将非常有用。非常感谢你的帮助。非常感谢。

编辑:有 2000 多个文件。我之所以想这样做,是因为想在较少玩过的游戏版本中找到新奇之处和新线路(从未玩过)。这就是我希望通过此操作实现的目标。

答案1

技术上您可以通过拨打以下电话来完成此操作sed...

# Note we have to escape the slashes to work with regex / sed here.
REPLACEWITH="1\/2-1\/2"  # or "0-1", or "1-0" depending on your intention
sed -i.orig "s/\*$/${REPLACEWITH}/g" FILENAME

...这将找到所有带有 的行尾实例*,并将其替换为您想要使用的游戏结束符号。只需确保如果符号/中包含任何字符,则将其替换/为 ,\/以便正确转义sed并供 shell 使用。

答案2

使用gawk。首先安装它:

sudo apt install gawk

您可以更换最后一个字符符合空间其次是1/2-1/2像这样:

for f in *.txt
    do
    gawk -i inplace '{gsub(/.$/," 1/2-1/2")}1' "$f"
    done
  • 从包含文件的目录中运行代码.txt

  • 您可以更改引号内的内容" 1/2-1/2" 注意第一个引号后的前导空格例如" 1-0"" 0-1"

  • 您可以更改.$*$仅替换最后一个字符*,而不是替换该行的任何最后一个字符。

答案3

您可以按照以下步骤删除文件中的最后一个字符*https://stackoverflow.com/questions/27305177/how-can-i-remove-the-last-character-of-a-file-in-unix。我稍微修改了一下,用其他东西代替它:

for f in *.txt; do
    sed -i.bak '$ s/\*$/ 1-0/' $f
done

*仅当位于最后一行末尾时,才会添加文本,正如您在问题中指定的那样。它还会复制带有.bak扩展名的原始文件。.bak如果您不需要备份文件,请删除 。

相关内容