Weird/unexpected bash 脚本中的字符串替换

Weird/unexpected string substitution in bash script

我有一个 bash 脚本可以根据内容重命名某些文本文件。具有以下内容的文件,例如应该重命名为 2020-05-11_Chess-com.txt.

[Site "Chess.com"]
[Date "2020-05-11"]
[White "Computer 6"]
[Result "0-1"]
[Termination " won by checkmate"]
... More content ...

下面是我当前使用的脚本模型:

#!/bin/bash 
site=$(sed -n '1p' < "" | cut -d ' ' -f2 | tr -d '"]' | tr ' .' '-')
datum=$(sed -n '2s/[^0-9-]*\([0-9-]*\)[^0-9-]*//p' < "")

echo "${datum}_${site}"  # 2020-05-11_Chess-com
echo "${datum}_${site}".txt  # .txt-05-11_Chess-com
echo "$datum"_"${site}".txt  # .txt-05-11_Chess-com

最后两行字符串替换的结果对我来说是完全出乎意料的,我发现很难找到任何解释脚本奇怪行为的方法。

不过,我观察到的一个结果是,如果我用 site="Chess-com" 替换 site=$(...) 行,那么我会得到预期的结果 2020-05-11_Chess-com.txt

您的代码看起来不错,但我建议您进行一些改进

site=$(sed -n 's/\[Site "\(.*\)"\]//p' "")
date=$(sed -n 's/\[Date "\(.*\)"\]//p' "")
echo "${date}_$site.txt"

或者像这样

read -d\n site date trash <<< $(sed 's|^.*"\(.*\)".*$||g' "")
printf '%s_%s.txt' $date $site

或者像这样

sed -n 'N;s|.*Site.*"\(.*\)".*"\(.*\)".*|_.txt|p' ""

您的脚本可以很好地处理您提供的示例,但它要求输入完全正常。也许切换到实际检查文件是否为预期格式的东西。

#!/bin/sh
awk '/\[Site / { site=; gsub(/[]"\r]/, "", site) }
    /\[Date / { datum=; gsub(/[]"\r]/, "", datum) }
    END { print datum "_" site ".txt" }' ""

这还负责删除任何 DOS 回车 returns,我想这可能是您问题的根源。