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,我想这可能是您问题的根源。
我有一个 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,我想这可能是您问题的根源。