首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash -编辑结构化文本

Bash -编辑结构化文本
EN

Stack Overflow用户
提问于 2018-05-20 12:37:46
回答 2查看 161关注 0票数 0

我想编辑这篇文章。

代码语言:javascript
复制
StringTable resource
{
    Entry _strings
    [ 

    //CUSTOM UI
        { String _name = "CCIconChartTip";          String _text = "Icon Chart for Colonial Charter."; }
        { String _name = "CCIconChart";             String _text = "Icon Chart"; }
.
.
.
    ]
}

要只显示"“中的一个单词(或句子),我如何编写代码?下面的代码是我的代码,但它们不起作用。

代码语言:javascript
复制
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

很抱歉我的英语能力不好。

输入输出

代码语言:javascript
复制
$ sh Banished_translator.sh
Enter a file name
NewLimitStringTable.rsc
Skip to b. Quit to q
Original :
Translate :

什么都没有输出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-20 18:42:58

我没有仔细查看您的代码,但至少看到了两个调用sed的实例,您可能并不打算这样做:

  1. 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的引用。
  2. sed 'string_nums/ori/trans/g' path 这应该会给您一个关于“未终止的s命令”的错误。我猜这里您的意思是sed "${string_num}s/$ori/$trans/g" "$path",但如果$ori包含被解释为正则表达式符号的字符,或者$trans包含类似的特殊字符,则这是行不通的。

而且,使用-eq进行的测试应该会产生错误,因为-eq用于测试整数的相等性。[ ... ]中的字符串比较是用=完成的。

假设没有嵌套或转义的",并且所有这样的字符串都不会在几行上断开。

使用您提供的数据:

代码语言:javascript
复制
$ grep -oE '"[^"]+"' file
"CCIconChartTip"
"Icon Chart for Colonial Charter."
"CCIconChart"
"Icon Chart"

表达式"[^"]+"将匹配一个",后面至少有一个非"字符和另一个"。请注意,这是一个相当简单的匹配,但它适用于您提供的数据。

此外,假设此输出的每一行都是您所引用的“原始”文本,并且您希望从用户处读取这些文本的翻译版本,并在原始文件中替换它们。我们可以创建一个由制表符分隔的对列表:

代码语言:javascript
复制
$ grep -oE '"[^"]+"' file | paste - -
"CCIconChartTip"        "Icon Chart for Colonial Charter."
"CCIconChart"   "Icon Chart"

..。然后阅读它,为用户创建我们的问题:

代码语言:javascript
复制
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,实际上向作者提供原始文件并让他们用文本编辑器编辑它的错误可能较少。

票数 0
EN

Stack Overflow用户

发布于 2018-05-20 18:19:27

你好,您的代码中有许多语法错误,还有一些奇怪的逻辑。要验证您的语法,可以使用https://www.shellcheck.net/

所提供的有限信息是我做得最好的,但以下是我对您的脚本的看法:

代码语言:javascript
复制
#!/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
done
  • 我添加了一个检查,以确保输入文件的存在,避免错误。
  • 我删除了while true。没有必要在您到达文件末尾之后永远查找。
  • 当您比较if语句中的数字时,使用-eq、-le、-lt、.要比较文本,请使用==!=

无论如何,试一试,并根据需要进行调整。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50434917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档