我想编辑这篇文章。
StringTable resource
{
Entry _strings
[
//CUSTOM UI
{ String _name = "CCIconChartTip"; String _text = "Icon Chart for Colonial Charter."; }
{ String _name = "CCIconChart"; String _text = "Icon Chart"; }
.
.
.
]
}要只显示"“中的一个单词(或句子),我如何编写代码?下面的代码是我的代码,但它们不起作用。
while true
do
((string_num++))
ori_string=$(sed -n '/string_num/p' $path)
mid=${ori_string%\"} #To cut a line started with " From behind
ori=${mid##\"} #To cut a line ended with "
echo "Original : $ori"
echo "Translate : "
read -r trans
if [ "$trans" -eq "p" ] # To skip
then
continue
elif [ "$trans" -eq "q" ] # To quit
then
break
fi
sed 'string_nums/ori/trans/g' path
done很抱歉我的英语能力不好。
输入输出
$ sh Banished_translator.sh
Enter a file name
NewLimitStringTable.rsc
Skip to b. Quit to q
Original :
Translate :什么都没有输出。
发布于 2018-05-20 18:42:58
我没有仔细查看您的代码,但至少看到了两个调用sed的实例,您可能并不打算这样做:
sed -n '/string_num/p' $path
这将在由string_num提供的文件中查找文字字符串$path。您可能指的是sed -n "/$string_num/p" "$path" (包含$string_num的打印行)或sed -n "${string_num}p" "$path" (打印行号$string_num)。还请注意$path的引用。sed 'string_nums/ori/trans/g' path
这应该会给您一个关于“未终止的s命令”的错误。我猜这里您的意思是sed "${string_num}s/$ori/$trans/g" "$path",但如果$ori包含被解释为正则表达式符号的字符,或者$trans包含类似的特殊字符,则这是行不通的。而且,使用-eq进行的测试应该会产生错误,因为-eq用于测试整数的相等性。[ ... ]中的字符串比较是用=完成的。
假设没有嵌套或转义的",并且所有这样的字符串都不会在几行上断开。
使用您提供的数据:
$ grep -oE '"[^"]+"' file
"CCIconChartTip"
"Icon Chart for Colonial Charter."
"CCIconChart"
"Icon Chart"表达式"[^"]+"将匹配一个",后面至少有一个非"字符和另一个"。请注意,这是一个相当简单的匹配,但它适用于您提供的数据。
此外,假设此输出的每一行都是您所引用的“原始”文本,并且您希望从用户处读取这些文本的翻译版本,并在原始文件中替换它们。我们可以创建一个由制表符分隔的对列表:
$ grep -oE '"[^"]+"' file | paste - -
"CCIconChartTip" "Icon Chart for Colonial Charter."
"CCIconChart" "Icon Chart"..。然后阅读它,为用户创建我们的问题:
exec 3<&1
grep -oE '"[^"]+"' file | paste - - |
while IFS=$'\t' read -r short long; do
printf 'Original:\t%s (%s)\n' "$long" "$short"
read -u 3 -rp 'Enter translation (p=pass, q=quit): ' trans
[ "$trans" = "p" ] && continue
[ "$trans" = "q" ] && break
sed -i "s/$long/\"$trans\"/" file # fixme
done我们需要在这里与文件压缩器进行一些杂耍,这样内部read就不会从paste的输出中读取。
sed遇到了与代码中相同的问题(如果您更正的话),因为$long或$trans中的任何字符如果碰巧是正则表达式字符,都会破坏对sed的调用。
不过,如果您找到了一种更好的方法,使用译者提供的文本来实际更新原始文件,那么一般的方法就会奏效。
IMHO,实际上向作者提供原始文件并让他们用文本编辑器编辑它的错误可能较少。
发布于 2018-05-20 18:19:27
你好,您的代码中有许多语法错误,还有一些奇怪的逻辑。要验证您的语法,可以使用https://www.shellcheck.net/。
所提供的有限信息是我做得最好的,但以下是我对您的脚本的看法:
#!/bin/bash
#
read -p "Enter a file name: " path
# validate file existance
if [ ! -f $path ]
then
echo "ERROR: file $path does not exist. Aborting."
exit 1
fi
# Counter to know which line the script is currently reading
string_num=0
# Number of lines in file $path
numberoflines=$(wc -l $path | awk '{print $1}')
echo ""
echo "Press 'p' or ENTER to pass, 'q' to quit."
# Read line per line up to the last line in the $path file
while [ $string_num -le $numberoflines ]
do
(( string_num++ ))
# Read the line number $string_num
ori_string=$(sed -n "${string_num}p" $path)
# First section of text enclosed in ""
ori=$(echo $ori_string | cut -d'"' -f2)
# Second section of text enclosed in ""
mid=$(echo $ori_string | cut -d'"' -f4)
echo ""
echo "Original: $ori"
read -p "Translation: " trans
if [ "$trans" == "p" ] # To skip
then
continue
fi
if [ "$trans" == "q" ] # To quit
then
break
fi
# If the $trans value is == $ori, then output the value of $mid
if [ "$trans" == "$ori" ] && [ "$ori" != "" ]
then
echo " RESULT: $mid"
fi
donewhile true。没有必要在您到达文件末尾之后永远查找。if语句中的数字时,使用-eq、-le、-lt、.要比较文本,请使用==或!=。无论如何,试一试,并根据需要进行调整。
https://stackoverflow.com/questions/50434917
复制相似问题