![我们如何将同一目录下每个文本文件最后一行(内容)末尾的 * 替换为 1/2-1/2 或 1-0 或 0-1?](https://linux22.com/image/1180588/%E6%88%91%E4%BB%AC%E5%A6%82%E4%BD%95%E5%B0%86%E5%90%8C%E4%B8%80%E7%9B%AE%E5%BD%95%E4%B8%8B%E6%AF%8F%E4%B8%AA%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E6%9C%80%E5%90%8E%E4%B8%80%E8%A1%8C%EF%BC%88%E5%86%85%E5%AE%B9%EF%BC%89%E6%9C%AB%E5%B0%BE%E7%9A%84%20*%20%E6%9B%BF%E6%8D%A2%E4%B8%BA%201%2F2-1%2F2%20%E6%88%96%201-0%20%E6%88%96%200-1%EF%BC%9F.png)
在各位朋友的指导下,我成功完成了几个文本文件的操作。首先非常感谢你们在命令方面的帮助。
现在,我希望进一步对文本文件进行这些操作,而我遇到的一个问题就是,我希望能够使用或或删除*
最后一行末尾的(同一目录下每个文本文件的)1/2-1/2
1-0
0-1
这是文本文件的内容:
- Nh3 d5 2. g3 e5 3. f4 Bxh3 4. Bxh3 exf4*
- Nh3 d5 2. g3 e5 3. f4 Bxh3 4. Bxh3 exf4 1/2-1/2
- Nh3 d5 2. g3 e5 3. f4 Bxh3 4. Bxh3 exf4 1-0
- Nh3 d5 2. g3 e5 3. f4 Bxh3 4. Bxh3 exf4 0-1
请忽略标题中的*,我只想更改文本文件的内容。
我希望这样做是因为通过将其从任何或1/2-1/2
或1-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
如果您不需要备份文件,请删除 。